¿Cómo se puede contar el número de caracteres o números en cada línea? ¿Hay algo así como un EOF que se parece más a un final de línea?Encontrar el tamaño de línea de cada fila en un archivo de texto
Respuesta
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;
}
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.
\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.
Él no tiene una cadena, él tiene un archivo. – danben
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 */
¿Puedes explicar el TAMAÑO? No estoy seguro si ese es un Var o un comando que C usa. – MRP
@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. :-) –
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
- 1. Leyendo un archivo de texto en MATLAB línea por línea
- 2. ¿Cómo recorre cada línea en un archivo de texto usando un archivo de lote de Windows?
- 3. Archivo de texto con^M en cada línea
- 4. Cómo imprimir el número de caracteres en cada línea de un archivo de texto
- 5. Agregue texto a cada línea en el archivo de texto usando PowerShell
- 6. Eliminación de los dos últimos caracteres de cada línea en un archivo de texto
- 7. ¿Cómo configuro una columna de cuadrícula/tamaño de fila sin definir cada línea?
- 8. leyendo un archivo de texto en R línea por línea
- 9. Leer un archivo de texto línea por línea en Qt
- 10. ¿Encontrar el índice del último elemento distinto de cero en cada fila de una matriz dada?
- 11. Cómo encontrar el tamaño de un archivo HDFS
- 12. cada línea del área de texto
- 13. Haskell: insertando cada línea de un archivo en una lista
- 14. ¿Cómo encontrar líneas únicas en un archivo de texto desde la línea de comandos?
- 15. ¿Cómo puede encontrar y reemplazar texto en un archivo usando el entorno de línea de comandos de Windows?
- 16. ¿Cómo puedo eliminar cada línea X en un archivo de texto?
- 17. ¿Cómo obtengo cada línea de un NSString?
- 18. imprime cada enésima línea en una fila usando gawk
- 19. Averigüe el número de 'línea' (fila) del cursor en un área de texto
- 20. ¿Cómo borrar la última línea en un archivo de texto?
- 21. ¿Cómo leo línea por línea un archivo de texto en ruby (alojado en s3)?
- 22. Unix encontrar tamaño promedio de archivo
- 23. Encontrar el tamaño de un empujón
- 24. escribir nueva línea en un archivo de texto en Matlab
- 25. Edición línea específica en el archivo de texto en Python
- 26. Importar archivo de texto con saltos de línea en Excel
- 27. Crear una lista que contenga cada línea de un archivo
- 28. jquery: ¿cómo recorre cada línea nueva de texto escrito dentro de un área de texto?
- 29. ¿Cómo agregar texto al final de cada línea en Vim?
- 30. Cómo insertar una palabra/texto al comienzo de cada línea
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
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
Sí, este código ayuda aunque tuve que cambiar algunas cosas. Pero tengo una mejor comprensión de cómo funciona esto. Gracias – MRP