从输入文件创建3D数组?

时间:2013-08-02 22:10:49

标签: c file input std multidimensional-array

我想将输入文件中的以下行存储到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数组。

我该如何解决这个问题?

2 个答案:

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