2011-05-04 52 views
0

所以我有一個二進制文件,我創建並初始化。如果我將指針設置爲seekg = 0seekp = 0,那麼我可以覆蓋文本行。但是,如果我向前跳過26個字節(我的文件的一行的大小以及我已經確認的東西),它會拒絕覆蓋。相反,它只是將它添加到二進制數據之前,並將舊數據進一步推送到線上。我希望數據完全覆蓋。二進制文件只覆蓋第一行C++

char space1[2] = { ',' , ' '}; 
int main() 
{ 
    CarHashFile lead; 
    lead.createFile(8, cout); 
    fstream in; 
    char* tempS; 
    tempS = new char[25]; 
    in.open("CarHash.dat", ios::binary | ios::in | ios::out); 
    int x = 2000; 
    for(int i = 0; i < 6; i++) 
     tempS[i] = 'a'; 
    int T = 30; 
    in.seekp(26);  //Start of second line 
    in.write(tempS, 6); //Will not delete anything, will push 
    in.write(space1, sizeof(space1)); //contents back 
    in.write((char *)(&T), sizeof(T)); 
    in.write(space1, sizeof(space1)); 
    in.write(tempS,6); 
    in.write(space1, sizeof(space1)); 
    in.write((char *)&x, sizeof(x)); 
    //Now we will use seekp(0) and write to the first line 
    //it WILL overwrite the first line perfectly fine 
    in.seekp(0); 
    in.write(tempS, 6); 
    in.write((char*) &x, sizeof(x)); 
    in.write(tempS, 6); 
    in.write((char *) &T, sizeof(T)); 
    return 0; 
} 

CarHashFile是創建一個二進制文件充滿了如下內容被調用時創建的文件外類:"Free, "1900", Black, $"0.00f。 引號中的所有內容都以字符串形式添加,1900以int形式添加,0.00f以浮動形式顯式添加。我通過寫入來添加所有這些,所以我非常肯定它是一個實際的二進制文件,我只是不知道爲什麼它只是選擇寫在第一行。我知道文件大小是正確的,因爲如果我設置seekp = 26它將在第二行的開頭打印並將其按下。 space是爲了方便地將「,」組合添加到文件而創建的,爲簡單起見,還有一個char dol[1] = '$'數組和一個char nl[1] = '\n',它允許我在二進制文件中添加一個新行(試圖刪除二進制文件,排,所以afaik,它需要)。

編輯:好吧,它一直在擦除線,它只是沒有把一個新的行(一種尷尬)。但現在我無法弄清楚如何在文件中插入換行符。我試着用我原來用char nl[1] = { '\n' }的方式寫它。當我第一次創建該文件時,這起作用,但之後不會。是否有其他方法來添加行?我也試過in << endl,什麼也沒得到。

+2

將一行文本寫入二進制文件意味着什麼? – 2011-05-04 22:42:47

+0

@Drew Hall,所有文件都是二進制文件。文本文件只是一個二進制文件,具有一定的限制和約定以及支持功能。 – 2011-05-04 22:47:37

+0

沒有文字的行。我的意思是隻有一行的內容。字符以文本形式存儲,其他所有內容都是亂碼垃圾。 – zmarine 2011-05-04 22:49:36

回答

0

我建議一次採取這一步。代碼對我來說看起來不錯,但缺少錯誤檢查意味着任何行爲都可能發生。 添加錯誤檢查和所有業務彙報英寸 如果顯示沒有問題,做一個簡單的尋求然後寫

result = in.pseek(26); 
//print result 
result = in.write("Hello World",10); 
// print result 
in.close(); 

讓知道會發生什麼

0

最終的問題不是我理解的文件流。這是我對二進制文件缺乏理解。換行符把所有東西都搞得一團糟,雖然在一個時間點可以很好地加入,但後來處理它是一件很麻煩的事情。一旦我將其刪除,其他所有事情都很順利。很多錯誤檢查或缺少關閉文件的原因是因爲它只是驅動程序代碼。它儘可能裸露的骨頭,我真的不在乎當時文件發生了什麼,我知道它正在被打開。爲什麼浪費我的時間?當主程序被重寫時,最終版本有錯誤檢查。就像我說的,我沒有得到的是二進制文件,而不是文件流。所以AJ的迴應根本不是很有用。我必須有25個字符作爲任務的一部分,沒有任何名字是25個字符長,所以它被填滿了垃圾。它是該項目的一個副產品,除此之外,我無法做到這一點,除了嘗試使用空格填充它,這隻需要花費更多的時間,而不是跳過並從那裏寫入。所以我選擇寫出平均名稱(8個字符),然後在25之後跳轉。我能夠說的唯一真正的解決方案就是Emile,他告訴我要得到一個十六進制編輯器。這真的有幫助。謝謝你的時間。