2013-03-01 16 views
2

我正在處理一個程序,該程序在文件中寫入文件時搜索一個結構中的特定字符串。如果我在該文件中找到匹配項,我需要覆蓋該結構的一部分。在文件中搜索匹配是非常容易的,但我正在努力覆蓋該結構。以下是我的代碼搜索文件,嘗試覆蓋該數據。C - 如何搜索一個文件並覆蓋它的一部分

dfp = fopen(archName, "ab"); 
    if(dfp == NULL) { 
     printf("An error has occurred... %s could not be opened.\n", archName); 
     return 0; 
    } /* End if */ 

    /* Read first header file */ 
    fread(&getHeader, sizeof(getHeader), 1, dfp); 

/* Check for match */ 
    if(strcmp(fName[0], getHeader.file_name) == 0) { 
     getHeader.deleted = (char)49; 
     fwrite(&getHeader, sizeof(getHeader), 1, dfp); 

請注意,getHeader是一個結構。有多個結構可以存儲在我的文件中的任何位置。我需要搜索每個標題的特定字符串(簡單)。當找到匹配項時,必須覆蓋該結構。

推薦什麼樣的過程來完成這樣的任務?

回答

6

您可以編寫一個循環將記錄讀入記錄結構中,一次一個。每次讀取之後,您可以將剛剛讀取的記錄與所需記錄進行比較,如果它不是您需要的記錄,則可以讀取下一個記錄。

你剛剛找到了你想要的記錄,但你也剛剛讀過記錄;你必須尋求重寫記錄。您每次都必須在讀取和寫入之間進行尋找,反之亦然,因爲C標準說如果您不這樣做,行爲是不確定的。這意味着在寫入之前進行尋找,並且在返回下一個記錄之前進行另一次尋找。

由於您已在"ab"模式下打開文件,因爲所有寫入操作都將在最後附加,所以任何查找都不重要。您可能需要"r+b"作爲fopen()的模式。

查看fseek() goes back to the end of file when writing a value瞭解最近對相同的一般問題的討論。

+0

我實際上已經嘗試使用fopen的所有可用選項,但無濟於事......當我使用「r + b」作爲我的模式並嘗試覆蓋給定的結構時,我最終創建了一個新的結構直接跟在我希望覆蓋的結構之後......這是fseek會發揮作用嗎?我是否需要將指針設置回我想覆蓋的結構的開始位置? – kubiej21 2013-03-01 03:19:41

+0

啊......只是意識到我在我的fseek電話中有一個錯字。感謝您的信息! – kubiej21 2013-03-01 03:40:23