【发布时间】:2021-04-07 23:46:04
【问题描述】:
我是 C 编程语言的新手。我正在学习文件 I/O,并且对 fseek 函数感到困惑。这是我的代码
#include <stdio.h>
#include <stdlib.h>
struct threeNumbers {
int n1,n2,n3;
}
int main (){
int n;
struct threeNumbers number;
FILE *filePointer;
if ((filePointer=fopen("\\\\wsl$\\Ubuntu-20.04\\home\\haseeb\\learningC\\file Input and Output\\program2\\program.bin","rb"))==NULL){
printf("error! opening file);
/* if pointer is null, the program will exit */
exit(1);
}
/* moves the cursore at the end of the file*/
fseek(filePointer,-sizeof(struct threeNumbers),SEEK_END);
for(n=1;n<5;++n){
fread(&number,sizeof(struct threeNumbers),1,filePointer);
printf (" n1:%i\tn2:%i\tn3:",number.n1,number.n2,number.n3);
fseek(filePointer,-2*sizeof(struct threeNumbers),SEEK_CUR);
}
fclose(filePointer);
return 0;
}
我知道这个程序将开始以相反的顺序(从后到前)从文件 program.bin 中读取记录并打印出来。 我的困惑是我知道“fseek(filePointer,-sizeof(struct threeNumbers),SEEK_END);”将光标移动到二进制文件的末尾。 “fseek(filePointer,-2*sizeof(struct threeNumbers),SEEK_CUR);”是什么意思做?我认为它会移动到当前位置,但是在这个程序中光标指向当前位置的意义何在?还有为什么它是 -2 而不是“-sizeof(struct threeNumbers)”?
【问题讨论】:
-
printf("error! opening file);中缺少"这就是为什么代码中的语法高亮不起作用的原因。 -
FILE *filePointer = fopen( ... );然后if ( filePointer == NULL ) ...比将作业塞进if语句更容易阅读和纠正。将赋值塞入if语句是一个坏主意,会导致代码难以阅读且容易出错。教你这样做的人从来没有接受过 24 小时电话修复生产代码中的错误。 -
除了缺少结束引号,
printf("error! opening file");还有其他问题。这是无用错误消息的典型示例,它被写入错误的位置。将错误消息写入 stderr,包括用于打开文件的路径,并包括错误原因。FILE *fp = fopen(path, mode); if( fp == NULL ) { perror(path); ... -
将文件按反向索引顺序读取到
struct数组中会更容易:for(n=4; n>=0; n--),然后打印结果,无需查找。 -
它向后移动
-2结构的原因是因为在读取了一个struct之后文件指针在下一个位置,因此您需要向后移动2个结构在前一个。如果您只移回 1 个结构,您将继续阅读相同的结构。
标签: c