¿Cómo ingresar un archivo y usarlo para contar las letras mayúsculas / minúsculas, los números y la puntuación?

Mi objective es simple. Para solicitar a un usuario un archivo de texto simple que contenga letras mayúsculas / minúsculas, dígitos y puntuación. Luego tome el archivo, ábralo y escanee cada uno de los elementos mencionados manteniendo un conteo de cada uno. Por último, escriba un total para cada uno (es decir, el total de letras en mayúsculas, el total de letras en minúsculas, el total de dígitos y el total de signos de puntuación).

Lamentablemente, mi pregunta no es tan simple. Estoy realmente confundido con la forma en que C pasa un archivo de entrada a una función como fgetc y luego lo prueba para incrementar los contadores. Mi progtwig falla y me estoy quedando sin ideas de por qué. Supongo que mi pregunta inicial es, ¿por qué se bloquea? Mi código está abajo;

#include  #include  #include  int main() { char Character = 0; int words = 0; int upper_case = 0; int lower_case = 0; int punctuation = 0; int digits = 0; int entered_words = 0; char user_filename[100]; char user_filecontent[100]; printf("Enter the filename of the file containing text and/or digits:\n"); printf("(hit the Enter key when done)\n"); gets(user_filename); FILE *fp; fp = fopen (user_filename, "r"); if (fp == NULL) { printf("\nError, Unable to open the file for reading\n"); } while((fp = fgetc(fp)) != EOF) { while((Character=fgetc(fp)) != '\n'); { if (isalnum (Character)) { if (!entered_words) { entered_words = 1; words++; } } else { if (entered_words) { entered_words = 0; } } if (isupper(Character)) { upper_case++; } else if (islower(Character)) { lower_case++; } else if (isdigit(Character)) { digits++; } else if (ispunct(Character)) { punctuation++; } } fclose(fp); } printf("Total number of words is %d.\n", words); printf("Total number of digits are %d.\n", digits); printf("Total number of uppercase letters is %d.\n", upper_case); printf("Total number of lowercase letters is %d.\n", lower_case); printf("Total number of punctuation characters is %d.\n", punctuation); return 0; } 

 #include  #include  #include  int main() { char Character = 0; int words = 0; int upper_case = 0; int lower_case = 0; int punctuation = 0; int digits = 0; int entered_words = 0; char user_filename[100]; char user_filecontent[100]; printf("Enter the filename of the file containing text and/or digits:\n"); printf("(hit the Enter key when done)\n"); gets(user_filename); FILE *fp; fp = fopen (user_filename, "r"); if (fp == NULL) { printf("\nError, Unable to open the file for reading\n"); } while((Character = fgetc(fp)) != EOF) { if (isalnum (Character)) { if (!entered_words) { entered_words = 1; words++; } } else { if (entered_words) { entered_words = 0; } } if (isupper(Character)) { upper_case++; } else if (islower(Character)) { lower_case++; } else if (isdigit(Character)) { digits++; } else if (ispunct(Character)) { punctuation++; } } fclose(fp); printf("Total number of words is %d.\n", words); printf("Total number of digits are %d.\n", digits); printf("Total number of uppercase letters is %d.\n", upper_case); printf("Total number of lowercase letters is %d.\n", lower_case); printf("Total number of punctuation characters is %d.\n", punctuation); return 0; } 

Quité el bucle while interno y moví la llamada a la función fclose fuera del bucle.

Le estás asignando a tu FILE *fp el resultado de un fgetc en tu prueba fgetc :

 while((fp = fgetc(fp)) != EOF) 

Esta es probablemente la causa de su accidente. fp es el identificador de su archivo una vez que haya llamado a fopen , después de eso solo necesita pasarlo a las funciones que tienen un FILE * , como fgetc y fclose .

También está llamando a fgetc dos veces: una vez en la prueba while , y luego inmediatamente siguiendo otra prueba while . Perderá los caracteres de esta manera, incluso después de solucionar el problema de fp . ¿Por qué necesitas el bucle interno?

hombre fgetc dice

fgetc () lee el siguiente carácter de la secuencia y lo devuelve como una conversión de caracteres sin firma a un int, o EOF al final del archivo o error.

Debes usar una variable int para almacenar este resultado