0

所以我有一个我创建和初始化的二进制文件。如果我将指针设置为seekg = 0or 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了,一无所获。

4

2 回答 2

0

我建议一次迈出这一步。代码对我来说看起来不错,但缺乏错误检查将意味着任何行为都可能发生。在 in 上的所有操作中添加错误检查和报告。如果没有问题,做一个简单的 seek 然后写

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

让我们知道会发生什么

于 2011-05-05T04:55:01.457 回答
0

最终问题不是我对文件流的理解。这是我对二进制文件缺乏了解。换行符把所有事情都搞砸了,虽然它可以在某个时间点很好地添加,但以后处理它是一个巨大的麻烦。一旦我删除了它,其他一切都恢复正常。很多错误检查或缺少关闭文件的原因是因为它只是驱动程序代码。它尽可能简单,我真的不在乎当时文件发生了什么,我知道它正在被打开。为什么要浪费我的时间?当主程序被重写时,最终版本有错误检查。就像我说的,我没有得到的是二进制文件,而不是文件流。所以 AJ 的回应一点用处都没有。我必须有 25 个字符作为作业的一部分,没有名字是 25 个字符长,所以它会被垃圾填满。它是该项目的副产品,我对此无能为力,只能尝试用空格填充它,这比跳过并从那里开始写要花费更多的时间。所以我选择写可能是平均名称(8 个字符),然后再向前跳 25 个字符。我可以说这里给出的唯一真正的解决方案是来自 Emile,他告诉我要获得一个 Hex Editor。这真的很有帮助。谢谢你的时间。我可以说这里给出的唯一真正的解决方案是来自 Emile,他告诉我要获得一个 Hex Editor。这真的很有帮助。谢谢你的时间。我可以说这里给出的唯一真正的解决方案是来自 Emile,他告诉我要获得一个 Hex Editor。这真的很有帮助。谢谢你的时间。

于 2011-05-05T07:33:41.747 回答