[英]Binary file only overwrites first line C++
所以我有一個我創建和初始化的二進制文件。 如果我將指針設置為seekg = 0
或seekp = 0
,那么我可以很好地覆蓋文本行。 但是,如果我向前跳 26 個字節(我的文件的一行的大小,並且我已經確認過),它拒絕覆蓋。 相反,它只是將它添加到二進制數據之前,並將舊數據進一步推到行上。 我希望數據完全覆蓋。
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
是一個外部 class ,它在調用創建文件時創建一個包含以下內容的二進制文件: "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
並沒有得到任何結果。
我建議一次邁出這一步。 代碼對我來說看起來不錯,但缺乏錯誤檢查將意味着任何行為都可能發生。 在 in 上的所有操作中添加錯誤檢查和報告。如果沒有問題,做一個簡單的 seek 然后寫
result = in.pseek(26);
//print result
result = in.write("Hello World",10);
// print result
in.close();
讓我們知道會發生什么
最終問題不是我對文件流的理解。 這是我對二進制文件缺乏了解。 換行符把所有事情都搞砸了,雖然它可以在某個時間點很好地添加,但以后處理它是一個巨大的麻煩。 一旦我刪除了它,其他一切都恢復正常。 很多錯誤檢查或缺少關閉文件的原因是因為它只是驅動程序代碼。 它盡可能簡單,我真的不在乎當時文件發生了什么,我知道它正在被打開。 為什么要浪費我的時間? 當主程序被重寫時,最終版本有錯誤檢查。 就像我說的,我沒有得到的是二進制文件,而不是文件流。 所以 AJ 的回應一點用處都沒有。 而且我必須有 25 個字符作為作業的一部分,沒有名字是 25 個字符長,所以它被垃圾填滿了。 它是該項目的副產品,我對此無能為力,只能嘗試用空格填充它,這比跳過並從那里開始寫要花費更多的時間。 所以我選擇寫可能是平均名稱(8 個字符),然后再向前跳 25 個字符。 我可以說這里給出的唯一真正的解決方案是來自 Emile,他告訴我要獲得一個 Hex Editor。 這真的很有幫助。 謝謝你的時間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.