我有一个以“r + b”模式打开的随机访问文件,其长度相等。我可以在阅读后更改记录的内容并在适当的位置覆盖吗?
我尝试了以下代码,但在运行时我得到:分段错误(核心转储)
#include<stdio.h>
int main()
{
struct tala {
int rec_no;
long file_no;
};
FILE *file_locking;
struct tala t,f;
file_locking = fopen("/path/to/my/file.bin", "rb+");
t.rec_no = 1;
t.file_no = 3;
if (fwrite(&t, sizeof(struct tala),1,file_locking)==0)
printf("Error opening file");
t.rec_no=0;
rewind(file_locking);
if (fwrite(&t, sizeof(struct tala),1,file_locking)==0)
printf("Error opening file");
rewind(file_locking);
if (fread(&f, sizeof(struct tala),1,file_locking)==0)
printf("Error opening file");
printf("\n %d",f.rec_no);
printf("\n %ld", f.file_no);
fclose(file_locking);
}
答案 0 :(得分:5)
是的,你可以。记住在读写之间总是fseek
。
引用fopen
手册页:
读取和写入可以以任何顺序混合在读/写流上。请注意,ANSI C要求输出和输入之间的文件定位功能介入,除非输入操作遇到文件结尾。
额外提示:始终检查fopen
及相关功能的返回值,并处理错误(使用perror
或strerror
打印出失败的内容)
答案 1 :(得分:1)
是。唯一需要注意的是,在从输出切换到输入之前必须调用flush或文件定位功能,并且在从read到write切换之前调用文件定位函数或者在文件结尾处。