我想将输入文件中的以下行存储到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数组。
我该如何解决这个问题?
答案 0 :(得分:0)
您可以使用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
指令提供扫描到目前为止所消耗的字节数。
答案 1 :(得分:0)
#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;
}