1

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

我怎么解决这个问题?

4

2 回答 2

0

您可以使用sscanf()组合 withfgets()一次解析一个数字。您可以通过在解析每个数字时将指针推进到字符串中来做到这一点。

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指令提供到目前为止在扫描中消耗的字节数。

于 2013-08-02T22:35:59.870 回答
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;
}
于 2013-08-02T22:45:08.477 回答