2011-05-15 98 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或文件定位功能,並且在從讀取切換到寫入之前調用文件定位功能或在文件末尾。