C/Visual C - ¿Por qué se repiten los últimos dos caracteres?

 
Vista:
sin imagen de perfil

¿Por qué se repiten los últimos dos caracteres?

Publicado por Nax (5 intervenciones) el 04/06/2016 23:34:14
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
//por que repite las letras del final del archivo?
#include <stdio.h>
#include <stdlib.h>
int main ()
{
FILE *archivo;
FILE *cifrado;
char caracter;
char i='0';
 
archivo = fopen( "prueba.txt" , "r" );
 
if (archivo == NULL )
{
printf("\n Error apertura archivo. \n\n ");
}
else
{
cifrado = fopen ( "cifrado.txt" , "w" );
if (cifrado == NULL )
{
printf("\n Error apertura archivo. \n\n ");
}
else
{
while (!feof(archivo))
{
caracter = fgetc(archivo);
printf( "%c%c",caracter,i);
fputc(caracter,cifrado);
fputc(i,cifrado);
}
}
fclose(archivo);
fclose(cifrado);
}
return 0;
}
 
 
//lo ejecuto con Móvil C en el móvil y la tablet.

muchas gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 296
Bronce
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

¿Por qué se repiten los últimos dos caracteres?

Publicado por agustin (272 intervenciones) el 05/06/2016 04:28:24
Eso pasa porque lee el último carácter, vuelve al inicio del bucle y feof no devolverá true ya que esta en el último carácter, luego intenta leerlo y si leerá eof pero ya es demasiado tarde ya que no hay más comprobaciones.
Lo mejor es usar un do while que use una variable para controlar su salida y dentro del bucle lees el carácter y luego usas un condicional con feof para comprobarlo. Si es true cambias el valor de la variable para forzar la salida del bucle y si es false haces lo que desees con el carácter leído. Algo asi:
1
2
3
4
5
6
7
8
9
10
11
int salir=0;
do{
   caracter = fgetc(archivo);
   if(!feof(archivo)){
      printf( "%c%c",caracter,i);
      fputc(caracter,cifrado);
      fputc(i,cifrado);
   }else {
      salir=1;
   }
}while (salir==0);
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar