首页 文章

C ofstream不会将预期的数字写入文件

提问于
浏览
0

美好的一天,我正在研究一个程序,它读取一个二进制文件(读取的函数给出并工作),然后将修改后的信息写回另一个二进制文件 . (我正在两种格式之间进行切换 . )如果我使用std :: cout将数字发送到控制台之前(或之后),我会使用ofstream将它们写入文件中 . 我得出了我预期的数字,但是如果我知道通过<<或写入将它们输入到流中,然后查看文件的内容 . (从这种格式到原始格式的转换存在,我可以使用它 . )然后我得到了carbage .

struct Record {
  unsigned latch;
  float e, x, y, u, v, wt;}

我读了给定的文件并修改了我读过的数字 . (以下是主函数的一部分) . 标头h已定义,并且存在默认构造函数 . phsp.read和copy是给定和工作的 . Reclen对应于记录长度并确保 Headers 写得正确,因为它对于不同的输入可以是不同的 .

std::ofstream outs;
outs.open(outfile, std::ios::out | std::ios::trunc);
Header h;
outs.write((char*) &h, reclen - 5);
for (int i=0; i<nMax; ++i){
   phsp.read(mp);
   copy(mp, ep);

Record rec;

修改数字并将它们放入rec,这是一个结构并在上面给出 . Rec应该写入文件

outs<<rec.latch<<rec.e<<rec.x<<rec.y<<rec.u<<rec.v<<rec.wt;

outs.write((char*) &rec.latch, 4);outs.write((char*) &rec.e, 4);
outs.write((char*) &rec.x, 4); outs.write((char*) &rec.y, 4);
outs.write((char*) &rec.u, 4);outs.write((char*) &rec.v, 4);
outs.write((char*) &rec.wt, 4);

outs.write((char*) &rec, reclen);
}

没有一个写,我想要的文件,但如果我通过std :: cout和控制台给出数字 . 我得到了预期的数字 .

std::cout<<rec.latch<<' '<<rec.e<<' '<<rec.x<<' '<<rec.y<<' '<<rec.u<<' '<<rec.v<<
' '<<rec.wt<<'\n';

我还用good()检查了出口流,我还检查了文件是否打开 . 我也可以写入文件 . 写入和<<输出也不会给出相同的输出(可以预期) . 我检查了rec.i的大小,它也对应于结构的大小 . 最后我再次更改 Headers ,因为我现在有了新信息 .

outs.seekp(5);
outs.write((char*) &h, reclen - 5);

outs.close();

在那里我也有同样的问题,错误的数字 . 我注意到0的数字对应于0,但是对于无符号的int数字,数字1被转换为16777216 .

我希望你能帮助我,我不知道出了什么问题 .

1 回答

  • 1

    您需要确定新文件格式是否应该使用二进制或文本表示形式的数据 .

    通常,当您使用 ofstream::write() 方法时,您将重新编写 . 因此,您将在文件中找到的不是数字,而是其二进制表示,如果将其视为文本,通常看起来像垃圾 .

    您可以使用十六进制编辑器查看该编号,或者您可以将其读回,然后将其解释为您选择的类型 . 例如:

    float number;
    ifs.read(&number, sizeof(float); // read in the 4 bytes from the file into a float
    

    这相当于:

    char* buffer = new char[sizeof(float)];
    ifs.read(buffer, sizeof(float)];
    float f = *(reinterpret_cast<float*>(buffer));
    

    如果在投射之前打印出缓冲区的内容,您会看到在文件中看到的相同垃圾 . 请注意,读取和写入二进制数据需要设置 ios::binary 标志 .

    operator<< 通常用于将数据写为文本 . 它在空间和速度方面效率较低,但具有人类可读的优点 . 将数据写为文本就像将其打印到屏幕一样简单,例如,

    std::ofstream ofs;
    ofs.open("file.txt");
    
    float f = 1.337f;
    ofs << "My float: " << f;
    std::cout << "My float: " << f;
    

    如果您在同一范围内使用上述代码,则文件中的内容无法与屏幕上显示的内容不同 .

    最后确保在使用它们之前初始化变量,就像在你发布的代码中你没有做到的那样 . 例如 .

    Header h; // <-- this probably contains rubbish until initialized with some values
    outs.write((char*) &h, reclen - 5); // <-- writes rubbish
    

相关问题