Problemas sobre el “espacio de emisión”

Estoy escribiendo un progtwig para contar el número de caracteres de espacio en blanco en un archivo de texto. Yo uso “isspace” para contarlo. El contenido del archivo de texto es “1 1 1”, pero el contador sigue siendo 0, ¿qué hay de malo en los códigos?

#include "stdafx.h" #include "ctype.h" int _tmain(int argc, _TCHAR* argv[]) { FILE* input; char x; int space = 0; input = fopen("123.txt", "r"); while ((fscanf(input, " %c", &x)) == 1) { if (isspace(x)) space++; } printf("space : %d\n", space); return 0; } 

Como he señalado anteriormente, necesitas usar fgetc (), no fscanf (). fscanf () no lee el espacio en blanco.

Las funciones de la familia scanf omitirán automáticamente los espacios en blanco cuando estén presentes en la cadena de formato. Considere usar fgetc en fgetc lugar.

Creo que usar fgetc (o getc ) es una mejor solución en este caso, pero las otras respuestas son erróneas acerca de fscanf en este caso. La familia de funciones scanf no omitirá espacios en blanco si utiliza "%c" como formato. La razón por la que su llamada no funciona es porque tiene un espacio en blanco en su formato. Entonces, en lugar de " %c" como formato, necesita usar "%c" sin el espacio inicial. El espacio fscanf le está diciendo a fscanf : salta todos los espacios en blanco y luego dame el siguiente carácter que no sea espacio en blanco. fscanf hace esto, asegurándose de que cualquier valor que obtenga en x no sea un espacio en blanco. Por lo tanto, su prueba de isspace prueba está probando una condición que ya se sabe que es falsa.

Puede solucionarlo fácilmente cambiando la especificación de formato a "%c" .

Habiendo dicho eso, creo que es mucho mejor usar fgetc / getc todos modos porque, como han descubierto, la familia de funciones de scanf es difícil de hacer bien.