SEEK_SET 未将指针设置为文件开头

SEEK_SET doesn't set the pointer to the start of the file

我正在尝试将此 .txt 文件作为列保存在数组中。

19 17 20 18
9  6  10 9 
12 11 10 16
3  7  9  10
0  5  8  6 
15 13 15 15
20 18 18 16
17 19 19 18
13 15 14 12
10 13 18 15

这是我到目前为止所做的,

    FILE *fp;
    int temp;
    int arr[4][10];

    fp = fopen("grade.txt", "r");

    for (int i = 0; i < 4; i++) {
        fseek(fp, i * 3, SEEK_SET);

        int c;
        for (int j = 0; j < 10; j++) {
            fseek(fp, i * 3, SEEK_CUR);
            fscanf(fp, "%d", &temp);
            arr[i][j] = temp;

            while ((c = fgetc(fp)) != '\n') {
                if (c == EOF)
                    break;
            }
        }
    }

这是我实际创建的数组,

arr[0] = 19 9 12 3 0 15 20 17 13 10 
arr[1] = 20 6 11 7 5 13 18 19 15 13 
arr[2] = 9 10 9 8 15 18 19 14 18 18 
arr[3] = 10 16 10 6 15 16 18 12 15 15 

如您所见,第一列已成功保存,但是从第二列开始,它变得很奇怪。看起来,fseek(fp, i * 3, SEEK_SET) 没有将指针设置到文件的开头,因为如果设置了,arr[1][0] 应该是 17,而不是 20。可以有人解释这里到底发生了什么吗?

在内循环中,您想转到文件中正确的“垂直”位置。我看到这段代码,我猜它打算这样做:

fseek(fp, i * 3, SEEK_CUR);

错误的原因不止一个。要保存 time/money,请注意您无法修复它:您不知道文件中的一行占用多少字节。

要修复它,请按自然顺序阅读您的文件,并删除对 fseek 的两个调用。因为 RAM 在访问顺序上比文件更灵活,所以这是最明智的做法。您可以按自然顺序读取文件,并按转置顺序存储数据。