2012-09-01 36 views

回答

3

您在普通桌面和服務器操作系統上找到的文件系統不支持插入,因此無法完成。

您必須重寫該文件。

3

我必須承認我很少使用fopen來處理數據的「複雜」操作,並且在文件中間添加東西並不是我經常做的事。通常,當我需要這種使用模式時,我只是用新數據覆蓋整個文件。所以在文件中間添加數據可能是一種聰明的方式,但我不知道:我相當肯定你只能覆蓋。

我能想到的在文件中間追加的最簡單方法如下:找到你需要寫的地方,找到你需要重新定位的字節數,找到要插入的數據的長度,移動寫光標到(需要寫入+長度的位置),使用需要重定位的數據覆蓋該位置的數據,然後編寫您首先需要寫入的內容。

#include <stdio.h> 
#include <stdlib.h> 

size_t finsert(void* data, size_t length, FILE* fp) 
{ 
    const long writePosition = ftell(fp); 
    fseek(fp, 0, SEEK_END); 
    const long fileSize = ftell(fp); 
    const long relocatedDataSize = fileSize - writePosition; 
    char* dataToRelocate = malloc(relocatedDataSize); 

    fseek(fp, writePosition, SEEK_SET); 
    fread(dataToRelocate, relocatedDataSize, 1, fp); 

    fseek(fp, writePosition + length, SEEK_SET); 
    fwrite(dataToRelocate, relocatedDataSize, 1, fp); 

    free(dataToRelocate); 

    fseek(fp, writePosition, SEEK_SET); 
    return fwrite(data, length, 1, fp); 
} 

請注意,您需要讀取和寫入文件的權限,只需寫入不會將其剪切。另外,正如Cole Johnson所提到的,如果您使用的文件「像數據庫」,請考慮使用SQLite。它爲你處理所有這些瘋狂的東西,並使許多事情變得更簡單。

+0

也許我正在以這種錯誤的方式進行。怎麼樣:我如何製作文件的臨時副本並將其重命名爲其他內容,刪除原件,打開與原件名稱相同的新文件,將新數據粘貼到頂部,然後粘貼現有的被複制到重命名文件的數據? – Garry

+0

@Garry,你想要的是在一個文件的開頭寫入數據,對吧? – zneak

+0

這是正確的。我想在文件的開始處寫入數據,並向下推送現有數據,而不會覆蓋其中的一部分。 – Garry