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 在访问顺序上比文件更灵活,所以这是最明智的做法。您可以按自然顺序读取文件,并按转置顺序存储数据。
我正在尝试将此 .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 在访问顺序上比文件更灵活,所以这是最明智的做法。您可以按自然顺序读取文件,并按转置顺序存储数据。