2010-01-26 10 views

Respuesta

5

Puede iterar a través de cada carácter en la línea y seguir incrementando un contador hasta que se encuentre el final de línea ('\n'). Asegúrese de abrir el archivo en modo de texto ("r") y no en modo binario ("rb"). De lo contrario, la transmisión no convertirá automáticamente secuencias de final de línea de plataformas diferentes en '\n' caracteres.

Aquí se muestra un ejemplo:

int charcount(FILE *const fin) 
{ 
    int c, count; 

    count = 0; 
    for(;;) 
    { 
     c = fgetc(fin); 
     if(c == EOF || c == '\n') 
      break; 
     ++count; 
    } 

    return count; 
} 

He aquí un programa de ejemplo para probar la función anterior:

#include <stdio.h> 

int main(int argc, char **argv) 
{ 
    FILE *fin; 

    fin = fopen("test.txt", "r"); 
    if(fin == NULL) 
     return 1; 

    printf("Character count: %d.\n", charcount(fin)); 

    fclose(fin); 
    return 0; 
} 
+0

Realmente no necesita ir carácter por carácter para obtener el índice de la nueva línea. Puede usar strcspn() para buscar el índice de '\ n'. (Consulte http://stackoverflow.com/questions/4824/string-indexof-function-in-c) – David

+0

strcspn() y strspn() no leen archivos. Para usarlos, tendrías que leer toda la línea en una cadena y luego volver a iterar a través de ella para encontrar el caracter '\ n'. Esto es menos eficiente. Por supuesto, depende de cómo MRP esté haciendo su código IO de archivo. – Sam

+0

Sí, este código ayuda aunque tuve que cambiar algunas cosas. Pero tengo una mejor comprensión de cómo funciona esto. Gracias – MRP

2

En cuanto a la lectura de un archivo línea por línea, mira fgets.

char *fgets(char *restrict s, int n, FILE *restrict stream); 

Los fgets() función deberá leer bytes de la corriente en la matriz señaló por s, hasta que se leen n-1 bytes, o una se lee y se transfiere a s, o un La condición de fin de archivo es . La cadena es entonces terminada con un byte nulo.

El único problema aquí puede ser si no puede garantizar un tamaño de línea máximo en su archivo. Si ese es el caso, puede iterar sobre los caracteres hasta que vea un salto de línea.

En cuanto a final de línea:

Respuesta corta: \n es el carácter de nueva línea (también llamado un avance de línea).

Respuesta larga, de Wikipedia:

Los sistemas basados ​​en ASCII o una cualquiera compatible con el uso conjunto carácter LF (Line alimentación, 0x0A, 10 en decimal) o CR (Retorno de carro, 0x0D, 13 en decimal) individualmente, o CR seguido de LF (CR + LF, 0x0D 0x0A); consulte a continuación el motivo histórico para la convención CR + LF . Estos caracteres se basan en comandos de impresora: El avance de línea indicó que una línea de papel debe alimentar fuera de la impresora, y un retorno carro indicó que el carro impresora debe volver a la principio de la línea actual.

* LF: Multics, Unix and Unix-like systems (GNU/Linux, AIX, Xenix, Mac OS X, FreeBSD, etc.), BeOS, Amiga, RISC OS, and others 
* CR+LF: DEC RT-11 and most other early non-Unix, non-IBM OSes, CP/M, MP/M, DOS, OS/2, Microsoft Windows, Symbian OS 
* CR: Commodore 8-bit machines, Apple II family, Mac OS up to version 9 and OS-9 

Pero ya que no es probable que trabajar con una representación que utiliza solamente retorno de carro, en busca de un avance de línea debe estar bien.

+0

Soo se puede hacer un bucle hasta Char = \ n – MRP

+0

derecha [15 caracteres] – danben

+0

ARCHIVO * en; in = fopen ("numbers.txt", "r"); if (in! = NULL) \t { ¿Utilizo un fget hasta \ n? – MRP

1

\n es el carácter de nueva línea en C. En otros lenguajes, como C#, se puede usar algo como C# Environment.EndLine para superar las dificultades de la plataforma.

Si ya sabe que su cadena es una línea (llamémosla línea), use strlen(line) para obtener el número de caracteres en ella. Resta 1 si termina con '\n'.

Si la cadena tiene nuevos caracteres de línea, deberá dividirla entre los nuevos caracteres de línea y luego llamar al strlen() en cada subcadena.

+0

Él no tiene una cadena, él tiene un archivo. – danben

1

Si abre un archivo en modo de texto, es decir, sin b en el segundo argumento a fopen(), puede leer los caracteres de uno en uno hasta llegar a un '\n' para determinar el tamaño de la línea. El sistema subyacente debe encargarse de traducir los terminadores de final de línea a solo un carácter, '\n'. La última línea de un archivo de texto, en algunos sistemas, puede no terminar con '\n', por lo que es un caso especial.

Pseudocódigo:

count := 0 
c := next() 
while c != EOF and c != '\n'" 
    count := count + 1 

lo anterior contará el número de caracteres en una línea determinada. next() es una función para devolver el siguiente carácter de su archivo.

Como alternativa, puede utilizar fgets() con una memoria intermedia:

char buf[SIZE]; 
count = 0; 
while (fgets(buf, sizeof buf, fp) != NULL) { 
    /* see if the string represented by buf has a '\n' in it, 
     if yes, add the index of that '\n' to count, and that's 
     the number of characters on that line, which you can 
     return to the caller. If not, add sizeof buf - 1 to count */ 
} 
/* If count is non-zero here, the last line ended without a newline */ 
+0

¿Puedes explicar el TAMAÑO? No estoy seguro si ese es un Var o un comando que C usa. – MRP

+0

@MRP: 'SIZE' es un valor integral positivo conveniente, ya sea una macro de pre-procesador o un número mágico. No te di un código completo, ya que no estoy seguro si es una pregunta de tarea. :-) –

+0

Bueno, si el TAMAÑO es un número que puse ... lo que necesito para el trabajo no funciona, ya que no sé el tamaño ... – MRP

Cuestiones relacionadas