Mientras ((c = getc (archivo))!! = EOF) el bucle no dejará de ejecutarse

No puedo entender por qué mi ciclo while no funcionará. El código funciona bien sin él … El propósito del código es encontrar un mensaje secreto en un archivo bin. Así que obtuve el código para encontrar las letras, pero ahora, cuando bash hacer que circule hasta el final del archivo, no funciona. Soy nuevo en esto. ¿Qué estoy haciendo mal?

main(){ FILE* message; int i, start; long int size; char keep[1]; message = fopen("c:\\myFiles\\Message.dat", "rb"); if(message == NULL){ printf("There was a problem reading the file. \n"); exit(-1); } //the first 4 bytes contain an int that tells how many subsequent bytes you can throw away fread(&start, sizeof(int), 1, message); printf("%i \n", start); //#of first 4 bytes was 280 fseek(message, start, SEEK_CUR); //skip 280 bytes keep[0] = fgetc(message); //get next character, keep it printf("%c", keep[0]); //print character while( (keep[0] = getc(message)) != EOF) { fread(&start, sizeof(int), 1, message); fseek(message, start, SEEK_CUR); keep[0] = fgetc(message); printf("%c", keep[0]); } fclose(message); system("pause"); } 

EDITAR:

Después de mirar mi código en el depurador, parece que tener “getc” en el ciclo while lo tiró todo. Lo arreglé creando un nuevo carácter llamado letra, y luego reemplazando mi código con esto:

 fread(&start, sizeof(int), 1, message); fseek(message, start, SEEK_CUR); while( (letter = getc(message)) != EOF) { printf("%c", letter); fread(&start, sizeof(int), 1, message); fseek(message, start, SEEK_CUR); } 

Funciona como un encanto ahora. Cualquier otra sugerencia es ciertamente bienvenida. Gracias a todos.

    El valor de retorno de getc() y sus parientes es un int , no un char .

    Si asigna el resultado de getc() a un char , una de las dos cosas sucede cuando devuelve EOF :

    • Si el char simple no está firmado, entonces EOF se convierte a 0xFF, y 0xFF! = EOF, por lo que el ciclo nunca termina.
    • Si se firma un char simple, entonces EOF es equivalente a un carácter válido (en el conjunto de códigos 8859-1, que es ÿ, y-diéresis, U + 00FF, LETRA Y MINÚSCULA LATINA CON DIAESIS), y su ciclo puede finalizar anticipadamente.

    Dado el problema al que se enfrenta, podemos suponer tentativamente que tiene un char simple como sin signo.

    La razón por la cual getc() et al devuelven un int es que tienen que devolver cada valor posible que pueda caber en un char y también un valor distinto, EOF. En el estándar C, dice:

    ISO / CEI 9899: 2011 §7.21.7.1 La función fgetc()

    int fgetc(FILE *stream);

    Si el indicador de fin de archivo para la secuencia de entrada apuntada por la stream no está configurada y hay un próximo carácter presente, la función fgetc obtiene ese carácter como un unsigned char convertido a una int

    Si se establece el indicador de fin de archivo para la transmisión, o si la transmisión se encuentra al final del archivo, se establece el indicador de fin de archivo para la transmisión y la función fgetc devuelve EOF.

    Se aplica una redacción similar a la función getc() y la función getchar() : están definidas para comportarse como la función fgetc() , excepto que si getc() se implementa como una macro, puede tomar libertades con el argumento de flujo de archivos normalmente no se otorga a las macros estándar; específicamente, la expresión del argumento stream puede evaluarse más de una vez, por lo que llamar a getc() con efectos secundarios ( getc(fp++) ) es muy tonto (pero cambiar a fgetc() y sería seguro , pero aún excéntrico).


    En tu ciclo, podrías usar:

     int c; while ((c = getc(message)) != EOF) { keep[0] = c; 

    Esto conserva la tarea de keep[0] ; No estoy seguro de que realmente lo necesites.

    Debería verificar las otras llamadas a fgets() , getc() , fread() para asegurarse de obtener lo que espera como entrada. Especialmente en la entrada, no puede darse el lujo de saltear esos controles. Más pronto que tarde, algo saldrá mal y si no está comprobando religiosamente los estados de retorno, es probable que su código falle o simplemente “falle”.

    Hay 256 valores de char diferentes que pueden ser devueltos por getc() y almacenados en una variable char como keep[0] (sí, estoy sobreescribiendo violentamente). Para detectar de forma confiable el final de archivo, EOF debe tener un valor diferente de todos ellos. Es por eso que getc() devuelve int lugar de char : porque un valor diferente 257 para EOF no cabría en un char .

    Por lo tanto, debe almacenar el valor devuelto por getc() en int al menos hasta que lo compruebe contra EOF :

     int tmpc; while( (tmpc = getc(message)) != EOF) { keep[0] = tmpc; ...