2011-05-15 96 views
3

我有一个随机访问文件以“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

可能重复[开放模式的二进制文件](http://stackoverflow.com/questions/6000430/opening-mode-of-binary-files) – 2011-05-15 07:07:40

回答

5

当然可以。只要记住在读取和写入之间总是fseek

报价fopen手册页:

读取和写入,可以在读取混合/以任意顺序写入流。请注意,ANSI C要求在输出和输入之间插入文件定位函数,除非输入操作遇到文件结束。

额外提示:总是检查fopen和相关函数的返回值,并处理错误(使用perrorstrerror打印出什么失败)。

+0

@Mat ...如果你检查我的代码将gratefull我现在已经包含了 – 2011-05-15 07:16:29

+1

@Lipika:你没有检查'fopen'的返回值,所以你是自己的。 – Mat 2011-05-15 07:29:39

+0

谢谢......问题出在fopen上。如果文件不存在,则以rb +模式打开不会创建该文件。 – 2011-05-15 11:13:31

1

是的。唯一需要注意的是,在从输出切换到输入之前,必须调用flush或文件定位功能,并且在从读取切换到写入之前调用文件定位功能或在文件末尾。