所以我有一个我创建和初始化的二进制文件。如果我将指针设置为seekg = 0
or 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
在调用 create file 时创建一个包含以下内容的二进制文件:"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
了,一无所获。