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

C++ ofstream doesn't write expected numbers into file

本文关键字:数字 文件 C++      更新时间:2023-10-16

您好,我正在开发一个程序,它读取一个二进制文件(提供了用于读取的函数并起作用),然后将修改后的信息写回另一个二进制文档。(我在两种格式之间切换。)如果我在使用流将数字写入文件之前(或之后)使用std::cout将数字发送到控制台。我得到了我预期的数字,但如果我知道的话,通过<lt;或者写然后查看文件的内容。(从这种格式到原始格式的转换是存在的,我可以使用它。)然后我得到了碳水化合物。

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

我读取给定的文件并修改我读取的数字。(以下是主要功能的一部分)。标头h已定义,并且存在一个默认构造函数。phsp.read和副本已提供并工作。Reclen与记录长度相对应,并确保标题写得正确,因为不同的输入可能不同。

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是上面给出的一个结构。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()检查了outs流,还检查了文件是否打开。我也可以写入文件。还有write和<lt;输出不提供相同的输出(可能是预期的)。我检查了rec.I的大小,它也与structs的大小相对应。最后,我再次更改标题,因为我现在有了新的信息。

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

在那里,我也有同样的问题,关于假数字。我注意到,数字0对应于0,但对于无符号整数,数字1被转换为16777216。

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

您需要决定新的文件格式应该使用二进制还是文本表示数据。

通常,当您使用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标志。

CCD_ 3通常用于将数据写入文本。它在空间和速度方面效率较低,但具有可读性的优势。以文本形式写入数据就像将其打印到屏幕上一样简单,例如

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