所以我有一個二進制文件,我創建並初始化。如果我將指針設置爲seekg = 0
或seekp = 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
,什麼也沒得到。
將一行文本寫入二進制文件意味着什麼? – 2011-05-04 22:42:47
@Drew Hall,所有文件都是二進制文件。文本文件只是一個二進制文件,具有一定的限制和約定以及支持功能。 – 2011-05-04 22:47:37
沒有文字的行。我的意思是隻有一行的內容。字符以文本形式存儲,其他所有內容都是亂碼垃圾。 – zmarine 2011-05-04 22:49:36