2010-09-02 78 views
0

我想用下面的代碼來回報一些字母。一些字符用fwrite刪除

但是,結果顯示 「A零位」 而不是 「A」 ......我怎樣才能去除零空間...

PS。我正在修改二進制文件信息。

char *pos = NULL; 
if(NULL != (posFind = strstr(fp, "AB"); 
    strncpy(&fp->base[0], "A", 2); 

if(_fseek64(fp, 0, SEEK_SET)!= 0) return ZD_ERROR_IO_FAILED; 

fwrite(&fp->base[0], 2, 1, fp); 
+1

你似乎在你的第一個if中缺少一些')'。 – 2010-09-02 01:25:44

+3

大家都錯過了這段代碼被破壞的原因 - 它直接在'FILE'結構的內部戳了一下。你不能將不需要調用未定義行爲的'FILE'結構本身的地址傳遞給'fwrite'。 – 2010-09-02 01:56:02

回答

1

你的意思是寫"A\0"(一A後跟一個零字節),是嗎?不是字面上的A,後跟一個NU和兩個L小號...

簡單地改變你的fwrite呼籲:

fwrite(&fp->base[0], 1, 1, fp); 

注2:1的變化這告訴fwrite寫從給定的數據只有一個字節,而不是兩個。 fwrite不處理C字符串strcpy和朋友做的方式;它處理原始字節數組,所以對空字節沒有特別的處理。如果您告訴fwrite寫入一些字節,並且遇到空字節,它將愉快地寫入空字節並繼續進行。

+0

我意味着我已經嘗試過AB - > A ....但結果顯示我AB-> A \ 0 .. 我想刪除'\ 0'....我試圖「fwrite( &fp-> base [0],1,1,fp);「但結果顯示我'AA'... 任何其他的好主意? – neheeee 2010-09-02 01:37:32

1

看來你的if語句看起來有點怪異

if(NULL != (posFind = strstr(fp, "AB"); 
    strncpy(&fp->base[0], "A", 2); 

值strstr不能被用來搜索文件中的字符串,你就需要加載該文件 和搜索在緩衝區中的字符序列,替換,然後寫回緩衝區,備選在加載的緩衝區中找到偏移量,然後將文件指針定位到相同的文件位置,以便在替換字符串具有相同長度時寫入替換字符串。

它也不建議直接擺弄文件指針成員,而是將FILE結構視爲不透明類型。

0

您無法從文件中間刪除一系列字符。您只能截斷文件的末尾。

這意味着要執行所需操作(刪除單個字節)的唯一方法是將文件中的每個後續位數據移回一個字節(通過全部讀取和寫入),然後截斷末尾該文件將其縮短一個字節。

不用說,通常人們都會避免這種情況。通常的選擇是:

  • 寫一個完整的新文件副本,然後重命名爲舊的;或
  • 定義一種文件格式,您的應用程序可以將數據標記爲「已刪除」,並且將忽略它。