¿Cómo leer en un archivo de texto de enteros separados por tabulaciones en C?

Tengo un archivo de enteros separados por tabulaciones (un archivo .txt) y deseo leerlos solo con C, línea por línea. Entonces, digamos que cada línea tiene 5 enteros. ¿Cómo puedo lograr esto?

Mi primer bash fue el siguiente. Era solo para leer en un solo entero, pero incluso eso no funcionaba:

FILE *fp; char blah[255]; int *some_int; fp = fopen("test.txt", "rt"); while (fgets(blah, 255, fp) != NULL) { sscanf(blah, "%d", some_int); printf("%d\n", *some_int); } 

Esta es una manera que nadie más sugirió, que no usa fscanf por lo que puede tener un buen manejo de errores:

 char buffer[BUFSIZE]; size_t size = 5; int *data = malloc(size * sizeof *line); if(line == NULL) error(); while(fgets(buffer, sizeof buffer, fp) { size_t i = 0; char *next = buffer; while(*next && *next != '\n') { data[i++] = strtol(next, &next, 0); // check for errors } } 

Básicamente, en lugar de intentar usar "%d" *scanf para leer caracteres, use la función a la que (probablemente) llama para hacer la conversión: strtol . Donde *scanf atraviesa la cadena para coincidir con la cadena de formato, pero no le permite “guardar su lugar” entre las llamadas a funciones, strtol hace, que es lo que necesita para leer un número arbitrario de enteros.

No he escrito todo tu código para ti, tienes que hacer el manejo del error duro. Los posibles errores incluyen:

  1. i == size , en cuyo caso puede intentar realloc data con realloc . Alternativamente, puede recorrer el búfer y contar cuántos números hay de antemano, luego asignar tantos para que no tenga que reasignar más tarde.
  2. fgets no leyó toda la línea (verifique que el último carácter antes de '\0' sea '\n' ). En este caso, probablemente querrá rellenar el búfer y seguir leyendo números. Tenga cuidado en este caso, es probable que tenga que volver atrás y volver a calcular el último número; es posible que los fgets se hayan cortado. (Esto es una desventaja de usar fgets ).
  3. Entrada errónea – maneja como quieras.
 #include  int main(){ FILE *fp; int scanned = 0; int some_ints[5]; fp = fopen("test.txt", "r"); while ((scanned = fscanf(fp, "%d %d %d %d %d", some_ints, some_ints+1, some_ints+2, some_ints+3, some_ints+4)) != EOF) { if(scanned ==5){ printf("%d %d %d %d %d\n", some_ints[0], some_ints[1], some_ints[2], some_ints[3], some_ints[4]); } else { printf("Whoops! Input format is incorrect!\n"); break; } } } 

Haría algo como esto:

 int storedVals[MAX_STORED_VALS]; int bf; int ii=0; while (!feof(fp) && ii 

fscanf realiza automáticamente el recorte de espacios en blanco. Entonces, siempre que haya un espacio en la cadena de escaneo, eliminará cero o más \ t (tabulaciones) y \ n (nuevas líneas) para encontrar el siguiente entero. Por supuesto, esto no hace mucho por la corrección de errores.