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

时间:2011-05-04 22:31:22

标签: c++ binaryfiles seek

所以我有一个我创建和初始化的二进制文件。如果我将指针设置为seekg = 0seekp = 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是一个外部类,在调用创建文件时会创建一个包含以下内容的二进制文件:"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并且什么也没得到。

2 个答案:

答案 0 :(得分:0)

我建议一步一步。代码看起来不错,但缺少错误检查意味着可能会发生任何行为。 向上的所有操作添加错误检查和报告。 如果没有显示任何问题,请执行简单的搜索然后编写

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

让我们知道会发生什么

答案 1 :(得分:0)

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