繁体   English   中英

SEEK_SET 不设置指向文件开头的指针

[英]SEEK_SET doesn't set the pointer to the start of the file

我正在尝试将数组中的 this.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。谁能解释什么是真的在这里吗?

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

fseek(fp, i * 3, SEEK_CUR);

错误的原因不止一个。 为了节省时间/金钱,请注意您无法修复它:您不知道文件中的一行占用了多少字节。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM