从文本文件读取数字到2D数组

尽管这里有很多例子我似乎无法让这个工作……

我有一个文本文件,包含很多行,每行有三个(int)值,由一个空格分隔。 例如:

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

我试图把它读成2d数组。

我的代码到目前为止:

  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; } 

有人可以提供建议我如何进一步开发这个,以便行中的每个值存储在一个单独的数组索引中? 在我上面的例子中,我们将存储类似于:

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

目前,它将整行存储在单个数组pos中。

你可能会说我是一个C菜鸟,任何帮助都会很棒!

你很顺利,你只是在思考你正在读一个字符数组而不是一个有符号字符数组(可以改为int等)时遇到了问题。这是你的例子:

 #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; } 

产量

 $ ./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 

注意: char lines[MAXL][MAXD]; 没关系,您必须明白每个元素都限制为8位有符号值,这意味着-128 < val < 127之间的值。 如果需要存储更大的值,可以将它们设为int

使用scanf 。 例:

 #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; } 

请注意,输入是从stdin读取的(使用fscanf以获得更大的灵活性),这意味着必须将上面的代码段调用为./a.out < data.txt

使用fgets,您正在从文件中读取整行。 然后,您需要解析此行以提取单个数字并将其存储到数组中。 在while循环中,您可以读取缓冲区中的行,然后使用类似strtok / sscanf的内容来解析每个数字。