[英]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.