簡體   English   中英

二進制文件僅覆蓋第一行 C++

[英]Binary file only overwrites first line C++

所以我有一個我創建和初始化的二進制文件。 如果我將指針設置為seekg = 0seekp = 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM