[英]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.