【问题标题】:Creating a 3D Array from an input file?从输入文件创建 3D 数组?
【发布时间】:2013-08-04 07:29:13
【问题描述】:
我想将输入文件中的以下行存储到 3D 数组中(不包括第一行。)第一行表示以下行数。
3
4 9368 86 843 23224
4 7323 2 2665 2665
8447 47 843 5278 8378 2273
我的问题是如果我使用 fscanf,则无法判断何时有换行符。因此我无法停止扫描并转到最外层数组中的下一个索引。如果我使用 fgets 和 sscanf,我只能读取每行的第一个字符串(在这种情况下,4 然后 4 然后 8447。)
那是因为 fgets 将整行作为一个字符串(1D 数组)处理,而我希望将每一行作为 2D 数组处理,然后将每行存储在最外层的数组中,从而产生 3D 数组。
我该如何解决这个问题?
【问题讨论】:
标签:
c
file
input
std
multidimensional-array
【解决方案1】:
您可以使用sscanf() 结合fgets() 一次解析一个数字。您可以通过在解析每个数字时将指针推进到字符串中来做到这一点。
while (fgets(buf, sizeof(buf), infile) != 0) {
const char *p = buf;
size_t len = strlen(buf);
int val;
int n;
while (sscanf(p, "%d%n", &val, &n) == 1) {
/*...do something with val */
p += n;
if (p >= buf+len) break;
}
}
%n 指令提供到目前为止在扫描中消耗的字节数。
【解决方案2】:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void){
char array[16][16][16];
char line[256];
FILE *fp = fopen("data.txt", "r");
fgets(line, sizeof(line), fp);
int row = atoi(line);
int i;
for(i = 0;i<row;++i){
int col = 0;
char *p;
fgets(line, sizeof(line), fp);
for(p = strtok(line, " \t\n");p;p=strtok(NULL, " \t\n")){
strcpy(array[i][col++], p);
}
array[i][col][0] = '\0';
}
fclose(fp);
{//check
for(int i=0;i<row;++i){
for(int j=0;array[i][j][0];++j)
printf("%s ", array[i][j]);
printf("\n");
}
}
return 0;
}