2012-10-04 30 views
5

Cuando intento ejecutar mi programa, obtengo el número incorrecto de líneas impresas.Función C que cuenta las líneas en el archivo

LINES: 0 

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

Aquí es mi programa:

#include<stdio.h> 
#include<stdlib.h> 

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 se trata de un simple error, pero soy nuevo programación. Cualquier ayuda sería muy apreciada.

+0

Usted debe dar un título que resume el error, no lo que haces cuando llegas el error. – Nobody

+3

La comparación de un 'char' contra' EOF' es un problema. –

+0

¿Por qué, @CarlNorum? – corazza

Respuesta

4

se declara

int countlines(char *filename) 

tomar un argumento char *.

usted lo llama como esto

countlines(fp) 

que pasa en un archivo *.

Es por eso que obtiene ese error de compilación.

probablemente debería cambiar esa segunda línea de

countlines("Test.txt") 

ya que abre el archivo en Countlines

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

+0

Cometí un error, main se supone que debe incluir un valor de argumento con el nombre del archivo. El programa se compila, pero obtengo un error de segmento (núcleo volcado). –

+2

Debe aceptar una respuesta que aborde su pregunta original, en lugar de cambiar por completo la pregunta por completo, y hacer una nueva pregunta. –

2

Está abriendo un archivo y pasando el puntero del archivo a una función que solo quiere un nombre de archivo para abrir el archivo. Puede simplificar su llamada a;

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

EDITAR: Está cambiando la pregunta, por lo que es muy difícil de responder; al principio tienes tu cambio en main() mal, olvidaste que el primer parámetro es argc, por lo que se colgó. 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. Elimine ese punto y coma adicional, y debe obtener un conteo razonable.

+0

Cambié el código para tomar un valor de argumento que es el nombre del texto. Obtengo el error del segmento de error (núcleo volcado) cuando ejecuto el programa ahora. –

+0

@ Michael_19 Bueno, 'main' realmente no toma los argumentos de esa manera. Intenta 'int main (int argc, char * argv [])' –

+0

@ Michael_19 Ok, un último intento de respuesta, pero sigues cambiando tu pregunta para que las respuestas existentes ya no se apliquen, y las respuestas se vuelven cada vez menos útiles a otros. Si tiene más preguntas, acepte una respuesta que lo ayude y formule una nueva pregunta con su nuevo problema. –

0

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

El acceso a argv[1] cuando no existe causa 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 hacerlo utilizando 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 lo que provoca una violación de segmento en general es el uso de 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 Ejecute con la depuración en lugar de "Ejecutar sin depuración" cuando inicie el programa. Detendrá la ejecución en la parte superior y te permitirá pasar línea por línea hasta que veas un problema.

Si está en Linux, puede simplemente tomar el archivo core (tendrá "núcleo" en el nombre) y cargarlo con gdb (Depurador GNU). Puede proporcionarle un volcado de pila que lo dirigirá directamente a la línea que provocó la falla de segmentación.

EDIT: Veo que ha cambiado su pregunta y el código. Así que esta respuesta probablemente ya no sea útil, pero la dejaré como es un buen consejo de todos modos, y veré si puedo abordar la pregunta modificada, en breve).

1

Usted tiene a; al final de if. Cambio:

if (fp == NULL); 
    return 0; 

a

if (fp == NULL) 
    return 0; 
+2

Esta es una de las muchas razones por las cuales ** si ** sin {} es una mala idea. – Lundin

0

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); 

}

Cuestiones relacionadas