C++ 二进制文件仅覆盖第一行C++;

C++ 二进制文件仅覆盖第一行C++;,c++,binaryfiles,seek,C++,Binaryfiles,Seek,所以我有一个我创建并初始化的二进制文件。如果将指针设置为seekg=0或seekp=0,则可以很好地覆盖文本行。但是,如果我提前26个字节(文件的一行大小,我肯定已经确认),它将拒绝覆盖。相反,它只是将其添加到二进制数据之前,并将旧数据进一步推送到行上。我希望数据被完全覆盖 char space1[2] = { ',' , ' '}; int main() { CarHashFile lead; lead.createFile(8, cout); fstream in;

所以我有一个我创建并初始化的二进制文件。如果将指针设置为
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;
}
char space1[2]={',','''};
int main()
{
卡哈什档案铅;
lead.createFile(8,cout);
fstream-in;
char*tempS;
tempS=新字符[25];
in.open(“CarHash.dat”,ios::binary | ios::in | ios::out);
int x=2000;
对于(int i=0;i<6;i++)
tempS[i]=“a”;
int T=30;
in.seekp(26);//第二行的开头
in.write(tempS,6);//将不删除任何内容,将推送
in.write(space1,sizeof(space1));//返回内容
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));
//现在我们将使用seekp(0)并写入第一行
//它将完全覆盖第一行
in.seekp(0);
in.write(tempS,6);
in.write((char*)&x,sizeof(x));
in.write(tempS,6);
in.write((char*)&T,sizeof(T));
返回0;
}
CarHashFile
是一个外部类,它在调用create file时创建一个包含以下内容的二进制文件:
“Free”,
1900
”,Black,$“
0.00f
。 引号中的所有内容都作为字符串添加,1900作为int添加,0.00f作为float添加。我通过write添加了所有这些,所以我很确定这是一个实际的二进制文件,我只是不知道为什么它只选择在第一行上写入。我知道文件大小是正确的,因为如果我设置
seekp=26
,它将在第二行的开头打印并向下推
space
是为了方便地将“,”组合添加到文件中而创建的,为了简单起见,还有一个
char-dol[1]='$'
数组,还有一个
char-nl[1]='\n'
可以让我在二进制文件中添加一行新行(只是尝试删除了那个二进制添加,它将所有内容强制放在一行上,所以需要这样做)


编辑:好吧,它一直在删除这一行,只是没有插入新的一行(有点尴尬)。但现在我不知道如何在文件中插入换行符。我试着用我最初使用的
char-nl[1]={'\n'}
编写它。这在我第一次创建文件时起了作用,但之后就不会了。是否有其他方法添加行?我也尝试了
在中,我建议一次只做一步。代码在我看来还可以,但是缺少错误检查意味着任何行为都可能发生。
将错误检查和报告添加到中的所有操作。
如果显示没有问题,请执行简单的查找,然后编写

result = in.pseek(26);
//print result 
result = in.write("Hello World",10);
// print result
in.close();

让我们知道会发生什么

最终的问题不是我对文件流的理解。这是因为我对二进制文件缺乏理解。这条新线把一切都搞砸了,虽然它可以在某个时间点很好地添加,但后来处理它是一个巨大的麻烦。一旦我把它取下来,其他的一切都很好地就位了。很多错误检查或缺少关闭文件的原因是因为它只是驱动程序代码。这是尽可能简单的,我真的不在乎文件在那个时候发生了什么,我知道它正在被打开。为什么要浪费我的时间?当主程序被重写时,最终版本会进行错误检查。就像我说的,我没有得到的是二进制文件,不是文件流。所以AJ的回答一点用处都没有。作为作业的一部分,我必须有25个字符,没有名字是25个字符长的,所以它被垃圾填满了。这是项目的副产品,我对此无能为力,只能尝试用空格填充它,这比跳过前面的内容并从那里开始写要花更多的时间。所以我选择了写一个大概是平均名字(8个字符)的名字,然后在25个字符之后跳到前面。我能说的唯一真正的解决办法是来自埃米尔,他告诉我要找一个十六进制编辑器。这真的很有帮助。谢谢您的时间。

将一行文本写入二进制文件意味着什么?@Drew Hall,所有文件都是二进制的。文本文件只是一个二进制文件,具有一定的限制、约定和支持功能,而不是一行文本。我是说只有一行的内容。字符存储为文本,其他的都是含糊不清的垃圾。@Mark:我知道——问题是如何解释数据。因为我们看不到输出代码,所以我们不知道他是在解释一个非空终止的字符串,好像它是空终止的,还是以其他方式误解了文件内容。@zmarine:你是如何检查你的文件的?你在使用十六进制编辑器吗?