Función C que cuenta las líneas en el archivo.

Cuando bash ejecutar mi progtwig, me imprimen el número incorrecto de líneas.

LINES: 0 

Esta es la salida aunque tengo cinco líneas en mi archivo .txt

Aquí está mi progtwig:

 #include #include int countlines(char *filename); void main(int argc, char *argv[]) { printf("LINES: %d\n",countlines(argv[1])); } int countlines(char *filename) { // count the number of lines in the file called filename FILE *fp = fopen(filename,"r"); int ch=0; int lines=0; if (fp == NULL); return 0; lines++; while ((ch = fgetc(fp)) != EOF) { if (ch == '\n') lines++; } fclose(fp); return lines; } 

Estoy seguro de que es un simple error, pero soy nuevo en la progtwigción. Cualquier ayuda sería muy apreciada.

 while(!feof(fp)) { ch = fgetc(fp); if(ch == '\n') { lines++; } } 

Pero tenga en cuenta: ¿Por qué el “while (! Feof (file))” siempre es incorrecto? .

Usted declara

 int countlines(char *filename) 

para tomar un argumento char *

Lo llamas asi

 countlines(fp) 

pasando en un archivo *.

Es por eso que obtienes ese error de comstackción.

Probablemente deberías cambiar esa segunda línea a

 countlines("Test.txt") 

Desde que abres el archivo en contadores

Su código actual está intentando abrir el archivo en dos lugares diferentes.

Está abriendo un archivo y, a continuación, pasa el puntero del archivo a una función que solo desea que un nombre de archivo abra el archivo. Puede simplificar su llamada a;

 void main(void) { printf("LINES: %d\n",countlines("Test.txt")); } 

EDIT: Estás cambiando la pregunta por lo que es muy difícil de responder; al principio obtuviste un cambio en main() incorrecto, olvidaste que el primer parámetro es argc, por lo que se bloqueó. Ahora tienes el problema de;

 if (fp == NULL); // <-- note the extra semicolon that is the only thing // that runs conditionally on the if return 0; // Always runs and returns 0 

que siempre devolverá 0. Quita ese punto y coma adicional y obtendrás un conteo razonable.

Usted tiene un ; al final del if . Cambio:

  if (fp == NULL); return 0; 

a

  if (fp == NULL) return 0; 

No veo nada inmediatamente obvio en cuanto a lo que causaría una falla de segmentación. Mi única sospecha es que su código espera obtener un nombre de archivo como parámetro cuando lo ejecute, pero si no lo pasa, intentará hacer referencia a uno, de todos modos.

Acceder a argv[1] cuando no existe causaría un error de segmentación. En general, es una buena práctica verificar el número de argumentos antes de intentar hacer referencia a ellos. Puede hacer esto usando el siguiente prototipo de función para main() y verificando que argc sea ​​mayor que 1 (simplemente, indicará el número de entradas en argv).

 int main(int argc, char** argv) 

La mejor manera de averiguar qué causa una falla de seguridad en general es usar un depurador. Si está en Visual Studio, coloque un punto de interrupción en la parte superior de su función principal y luego elija Ejecutar con depuración en lugar de “Ejecutar sin depurar” cuando inicie el progtwig. Detendrá la ejecución en la parte superior y le permitirá avanzar línea por línea hasta que vea un problema.

Si está en Linux, puede simplemente tomar el archivo del núcleo (tendrá “núcleo” en el nombre) y cargarlo con gdb (GNU Debugger). Puede darle un volcado de stack que lo dirigirá directamente a la línea que causó la falla de segmentación.

EDITAR: Veo que cambió su pregunta y código. Entonces, probablemente esta respuesta ya no sea útil, pero la dejaré ya que es un buen consejo de todos modos, y veré si puedo abordar la pregunta modificada, en breve).

Aquí está mi función

 char *fileName = "input-1.txt"; countOfLinesFromFile(fileName); void countOfLinesFromFile(char *filename){ FILE* myfile = fopen(filename, "r"); int ch, number_of_lines = 0; do { ch = fgetc(myfile); if(ch == '\n') number_of_lines++; } while (ch != EOF); if(ch != '\n' && number_of_lines != 0) number_of_lines++; fclose(myfile); printf("number of lines in %s = %d",filename, number_of_lines); 

}