c - 与 C 中的 fseek() 混淆
问题描述
我是 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)”?
解决方案
忽略实际代码,这就是fseek()
:
The fseek() function sets the file position indicator for the stream
pointed to by stream. The new position, measured in bytes, is obtained
by adding offset bytes to the position specified by whence. If whence
is set to SEEK_SET, SEEK_CUR, or SEEK_END, the offset is relative to
the start of the file, the current position indicator, or end-of-file,
respectively. A successful call to the fseek() function clears the
end-of-file indicator for the stream and undoes any effects of the
ungetc(3) function on the same stream.
fseek(filePointer,-sizeof(struct threeNumbers),SEEK_END)
不会“将光标移动到二进制文件的末尾”;它将sizeof(struct threeNumbers)
在文件末尾之前移动它。
推荐阅读
- python - 从 Tkinter,我如何将字符串转换为整数以用于潜在的随机密码生成器
- php - WooCommerce 自定义设置选项卡验证
- javascript - react js中的步进标签字体大小
- jquery - 如何从动态选择下拉列表中提取值
- kubernetes - Kubernetes url 上的 nginx 入口路由到主机
- visual-studio-code - 如何更改 Visual Studio Code 标记和标签字体?
- r - 多因素 T 检验
- uikit - SwifUI 通过实现 UIViewRepresentable 使用 UIKit 组件
- umbraco - Umbraco 8.0 登录问题
- github - github页面构建失败:超时