Leer números del archivo de texto a matriz 2D

A pesar de los numerosos ejemplos aquí, parece que no puedo hacer que esto funcione …

Tengo un archivo de texto, que contiene muchas filas, cada fila tiene tres (int) valores separados por un solo espacio. Por ejemplo:

1 0 0 0 0 0 1 0 1 0 0 2 1 0 2 

Estoy tratando de leer esto en una matriz 2D.

Mi código hasta ahora:

  int main(void) { char c; int i = 0; int maxLines = 18; char lines[maxLines][BUFSIZ]; FILE *fp = fopen("inputs/control.txt", "r"); if (fp == 0) { fprintf(stderr, "failed to open inputs/control.txt\n"); exit(1); } char buffer[maxLines]; while (i < maxLines && fgets(buffer[i], sizeof(buffer[0]), fp)) { sscanf (buffer, "%d %d %d", &lines[i][0], &lines[i][1], &lines[i][2]); i++; } fclose(fp); return 0; } 

¿Puede alguien asesorarme sobre cómo puedo desarrollar esto más para que cada valor de la fila se almacene en un índice de matriz separado? En mi ejemplo anterior, almacenaríamos algo como:

 lines[0][0] = 1 lines[0][1] = 0 lines[0][2] = 0 and so on..... 

Actualmente almacena toda la fila en una sola matriz pos.

Como probablemente puedas decir que soy un C noob, ¡cualquier ayuda sería fantástica!

Estuvo bien encaminado, solo tuvo problemas al pensar que estaba leyendo una matriz de caracteres en lugar de una matriz de caracteres firmados (que podrían cambiarse a int, etc.) Aquí está su ejemplo:

 #include  #define MAXB 32 #define MAXL 18 #define MAXD 3 int main(void) { int i = 0; int numlines = 0; char buf[MAXB] = {0}; char lines[MAXL][MAXD]; FILE *fp = fopen("inputs/control.txt", "r"); if (fp == 0) { fprintf(stderr, "failed to open inputs/control.txt\n"); return 1; } while (i < MAXL && fgets (buf, MAXB - 1, fp)) { if (sscanf (buf, "%hhd %hhd %hhd", &lines[i][0], &lines[i][1], &lines[i][2]) == 3) i++; } fclose(fp); numlines = i; int j = 0; for (i = 0; i < numlines; i++) for (j = 0; j < MAXD; j++) printf (" line[%2d][%2d] : %hhd\n", i, j, lines[i][j]); printf ("\n"); return 0; } 

Salida

 $ ./bin/read_array_a3 line[ 0][ 0] : 1 line[ 0][ 1] : 0 line[ 0][ 2] : 0 line[ 1][ 0] : 0 line[ 1][ 1] : 0 line[ 1][ 2] : 0 line[ 2][ 0] : 1 line[ 2][ 1] : 0 line[ 2][ 2] : 1 line[ 3][ 0] : 0 line[ 3][ 1] : 0 line[ 3][ 2] : 2 line[ 4][ 0] : 1 line[ 4][ 1] : 0 line[ 4][ 2] : 2 

Nota: char lines[MAXL][MAXD]; está bien, solo debe comprender que cada elemento está restringido a un valor con signo de 8 bits , lo que significa valores entre -128 < val < 127 . Puede hacerlas int si necesita almacenar valores más grandes.

Utilice scanf . Ejemplo:

 #include  int main(int argc, char *argv[]) { int i, j; int lines[18][3]; i = 0; while ( i != sizeof(lines) / sizeof(lines[0]) && 3 == scanf("%i %i %i", lines[i] + 0, lines[i] + 1, lines[i] + 2) ) { i++; } for (j = 0; j !=i; j++) { printf("%i %i %i\n", lines[j][0], lines[j][1], lines[j][2]); } return 0; } 

Tenga en cuenta que la entrada se lee desde stdin (use fscanf para obtener más flexibilidad), lo que significa que el fragmento de ./a.out < data.txt anterior debe llamarse como ./a.out < data.txt .

Usando fgets estás leyendo toda la línea del archivo. Deberá analizar esta línea para extraer números individuales y almacenarlos en la matriz. En el bucle while puedes leer la línea en un búfer y luego usar algo como strtok / sscanf para analizar cada número.