Visual C++-将双精度和整数写入二进制文件
Visual C++ - Writing doubles and integers to binary files
我正在从一个文本文件中读取信息,然后将其输出到一个bin文件。我得到了正确书写的名称,但整数和双精度不能正常工作。不考虑系统("暂停"),它们是这样我就可以检查我的输出了。
#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
struct SaleSlip{
char name[20];
int prodID;
double value;
};
void main(){
fstream slips, binslip;
SaleSlip sales[17];
binslip.open("SaleSlips.bin", ios::out | ios::binary | ios::trunc);
slips.open("SaleSlips.txt", ios::in);
if(slips.eof()){
cout << "Cannot open file - SaleSlips.txt"<< endl;
system("pause");
exit(2);
}
int i = 0;
while(!slips.eof()){
slips >> sales[i].name;
slips.ignore(80, ' ');
slips >> sales[i].prodID;
slips.ignore(80, ' ');
slips >> sales[i].value;
slips.ignore(80, 'n');
cout << sales[i].name;
cout << sales[i].prodID;
cout << sales[i].value << endl;
binslip.write((const char *)&sales[i].name, sizeof(sales[i].name));
binslip.write((const char *)&sales[i].prodID, sizeof(sales[i].prodID));
binslip.write((const char *)&sales[i].value, sizeof(sales[i].value));
i++;
}
slips.close();
binslip.close();
system("pause");
}
SaleSlips.txt的数组中每个项目有一行,所以"Ryan 2 1400.52"是一行。Ryan的解释是正确的,但当我从二进制文件中读回来时,它是不对的,当我在文本板中检查它时也是不对的。
binslip.write
是一个未格式化的输出函数。有格式化的和未格式化的输入/输出。当您使用未格式化的输出时,您正在向文件写入原始字节。对于字节实际代表的内容没有任何解释。
当你写信给SalesSlips.bin时,你写的是字符后面跟着数字(更确切地说,你认为应该是数字)。当您尝试检查SalesSlips.bin时,计算机读取文本字符,并期望文件的其余部分为文本,但事实并非如此。数字和字符的表示方式不同。即使你只处理数字,积分和浮点值在二进制中的表示方式也不同。它现在可能有点让你吸收,但它的要点是你需要使用FormattedOutputFunction。这将执行正确输出数据所需的内部转换。
假设你有一个数字,比方说,50。如果没有描述50所代表的单位,这个数字是没有意义的。50秒?50英尺?50个州?你可以把binslip.write
想象成只写50,当你稍后试图读取文件时,你看到的只是50,你不明白它应该代表什么,这就是为什么它在你看来像胡言乱语。
要修复您的代码,您需要将binslip.write
行替换为:
binslip << sales[i].name << sales[i].prodID << sales[i].value;
在这种情况下,operator<<
的行为与FormattedOutputFunction
类似,因此当您编写SaleSlips.bin时,您可以在文本编辑器中打开它,并按照预期查看Ryan 2 1400.52
。
在BINARY模式下读写时,不需要在任何文本编辑器中读取数据。它根本没有任何作用。如果您想在文本编辑器中阅读,建议使用NORMAL模式。
无论如何,如果你不想在文本编辑器中查看二进制数据,你可以使用以下行来读取和写入二进制文件:
while(!slips.eof())
{
slips >> sales[i].name;
slips.ignore(80, ' ');
slips >> sales[i].prodID;
slips.ignore(80, ' ');
slips >> sales[i].value;
slips.ignore(80, 'n');
cout << sales[i].name;
cout << sales[i].prodID;
cout << sales[i].value << endl;
//// WRITE THE STRUCTURE AT ONCE
binslip.write((const char *)&sales[i], sizeof(sales[i]));
i++;
}
binslip.flush();
binslip.close();
//// OPEN UP THE FILE IN READ MODE
binslip.open("SaleSlips.bin", ios::in | ios::binary );
SaleSlip sale;
//// READ UP THE COMPLETE STRUCTURE
binslip.read((char *)&sale, sizeof(sale));
//// PRINT IT.
cout<<sale.name;
cout<<sale.prodID;
cout<<sale.value;
- 从二进制文件中读取整数数组
- 读取二进制文件并解释为整数
- 读取 64 位整数二进制文件
- 我正在尝试读取一个包含字符串和整数的二进制文件..并打印出与字符串对应的整数
- 将fortran生成的二进制文件读取到C++中的带符号整数数组中
- 将从二进制文件读取的字符串转换为整数
- 从/到C 的二进制文件读取和写作整数
- 无法将大型无符号整数正确写入二进制文件 - C++
- 从二进制文件 c++ 读取 16 位整数
- 正在尝试读取4字节无符号整数的二进制文件并转换为伏特
- 如何仅将 16 位分配给二进制文件中的任何整数,而不是C++中的正常 32 位
- 读取二进制文件并转换为整数数组时出现问题
- 如何将整数和双精度输出到二进制文件
- 将整数写入二进制文件C++时出现问题
- 二进制文件写入后读取负整数
- Visual C++-将双精度和整数写入二进制文件
- 使用C++将整数写入二进制文件
- 如何在表示二进制文件的字符串中查找整数
- c++如何将整数写入二进制文件,保持4字节长
- 为什么使用write函数而不是整数将奇怪的符号写入二进制文件