C++流不会将预期的数字写入文件
C++ ofstream doesn't write expected numbers into file
您好,我正在开发一个程序,它读取一个二进制文件(提供了用于读取的函数并起作用),然后将修改后的信息写回另一个二进制文档。(我在两种格式之间切换。)如果我在使用流将数字写入文件之前(或之后)使用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
- 如何在C++中确定文本文件中的元素是字符还是数字
- 使用fstream对txt文件中的数字进行循环
- 如何在 C++ 中将文件中的逗号分隔数字读取到数组中?
- 为什么当我输入较大的数字时,我的程序会到达文件末尾?
- 如何从也包含C++字母的文本文件中提取某些数字?
- 如何将 UTF-8 文本从文件转换为某个可以迭代的容器,并检查每个符号是否为C++字母数字?
- 从.txt文件中读取浮点型数字并在公式中使用它们
- 在 txt 文件中显示前两个数字的程序
- 尝试将数字写入二进制文件时引发异常
- 为什么我的程序在读取/写入文件时会删除最重要的数字?
- C++:从文件中读取字符串和整数,并获得最大数字
- 一个C++程序,用于在输入位数时输出具有特定位数的 .txt 文件中的所有数字
- 如何读取具有数字间隔的文本文件?C++
- 如何知道文本文件中的输入是否是 C++ 中的有效数字
- 如何删除文件中的数字,通过 c++ fstream 的
- 在c++中读取文件时,它如何自动将字符放入字符数组,将数字放入整数变量
- 如何从txt文件c++中提取括号之间的数字
- 在获取从文件到矢量的每一行之后,数字将被更改或销毁
- 如何将数字输出到文件中,所有数字都具有相同的精度
- 将数字文件读入数组,同时每1026个条目跳过前两个值