txt - ¿Cómo leer una línea del archivo?
leer una linea especifica de un archivo en c# (8)
Básicamente, tendrás que guardar la posición del archivo ptr a través de fgetpos, caminar hasta el final de la línea (como lo definas), guardar ese tamaño, fsetpos a la posición anterior, asignar un buffer lo suficientemente grande como para mantener la línea, y luego llame a fread con el nuevo buffer.
Tengo que leer un archivo txt con líneas formateadas así:
1: (G, 2), (F, 3) 2: (G, 2), (F, 3) 3: (F, 4), (G, 5) 4: (F, 4), (G, 5) 5: (F, 6), (c, w) 6: (p, f), (G, 7) 7: (G, 7), (G, 7) w: (c, w), (c, w)
Cada línea alimentará una estructura con sus datos (los 5 números o letras en ella).
¿Cuál es la mejor manera de leer la línea y obtener las cadenas que quiero?
Actualmente estoy usando una larga secuencia de condiciones usando fgetc
pero eso parece feo y no muy inteligente.
No puedo usar matrices porque las líneas pueden variar en tamaño si los números tienen dos dígitos.
Creo que podrías analizarlo de la siguiente manera:
fscanf(file,"%c: (%c, %c), (%c, %c)", &first,&second,&third,&fourth,&fifth);
Suponiendo que tiene las variables correctas, esto debería funcionar:
fscanf(fp, "%[^:]: (%[^,], %[^)]), (%[^,], %[^)])", a, b, c, d, e);
fp es un puntero de archivo y "a" a "e" son punteros de char
Usa fgets()
:
#include <stdio.h>
int main(void)
{
char line[256];
while(fgets(line, sizeof(line), stdin) != NULL) // fgets returns NULL on EOF
{
// process line; line is guaranteed to be null-terminated, but it might not end in a
// newline character ''/n'' if the line was longer than the buffer size (in this case,
// 256 characters)
}
return 0;
}
fgets () y sscanf () como recuerdo
#include <stdio.h>
int main (void)
{
char buf[81]; /* Support lines up to 80 characters */
char parts[5][11]; /* Support up to 10 characters in each part */
while (fgets(buf, sizeof(buf), stdin) != NULL)
{
if (sscanf(buf, "%10[^:]: (%10[^,], %10[^)]), (%10[^,], %10[^)])",
parts[0], parts[1], parts[2], parts[3], parts[4]) == 5)
{
printf("parts: %s, %s, %s, %s, %s/n",
parts[0], parts[1], parts[2], parts[3], parts[4]);
}
else
{
printf("Invalid input: %s", buf);
}
}
return 0;
}
Muestra de ejecución:
$ ./test
1: (G, 2), (F, 3)
2: (G, 2), (F, 3)
3: (F, 4), (G, 5)
4: (F, 4), (G, 5)
5: (F, 6), (c, w)
6: (p, f), (G, 7)
7: (G, 7), (G, 7)
w: (c, w), (c, w)
parts: 1, G, 2, F, 3
parts: 2, G, 2, F, 3
parts: 3, F, 4, G, 5
parts: 4, F, 4, G, 5
parts: 5, F, 6, c, w
parts: 6, p, f, G, 7
parts: 7, G, 7, G, 7
parts: w, c, w, c, w
Si el último valor en la entrada tiene más de 10 caracteres, se truncará sin indicación de error, si esto no es aceptable, puede usar el especificador de conversión %c
como un sexto argumento para capturar el siguiente carácter después del último valor y hacer Seguro que es un paréntesis de cierre.
#include void f() { FILE* fp; if ( (fp = fopen("foo.txt", "r")) == NULL) { perror("fopen"); return; } char ch[5]; while (fscanf(fp, "%c: (%c, %c), (%c, %c)/n", &ch[0], &ch[1], &ch[2], &ch[3], &ch[4]) == 5) { printf("--> %c %c %c %c %c/n", ch[0], ch[1], ch[2], ch[3], ch[4]); } fclose(fp); }
fscanf funciona muy bien, pero tendrá que usar conversiones de cadenas, ya que los caracteres no funcionarían para números con más de un dígito.
¿No es este un tipo de tarea?
#include <stdio.h>
void main(int argc, char **argv) {
FILE * f;
f = fopen(argv[1], "r");
while (1) {
char char_or_num[32][5]; // five string arrays, up to 32 chars
int i;
int did_read;
did_read = fscanf(f, "%32[0-9a-zA-Z]: (%32[0-9a-zA-Z], %32[0-9a-zA-Z]), (%32[0-9a-zA-Z], %32[0-9a-zA-Z])/n", char_or_num[0], char_or_num[1], char_or_num[2], char_or_num[3], char_or_num[4]);
if (did_read != 5) {
break;
}
printf("%s, %s, %s, %s, %s/n", char_or_num[0], char_or_num[1], char_or_num[2], char_or_num[3], char_or_num[4]);
}
fclose(f);
}