c++ - Visual C++ - 将 double 和整数写入二进制文件

标签 c++ visual-c++

我正在从一个文本文件中读取信息,然后将其输出到一个 bin 文件中。我得到了正确写入的名称,但整数和 double 不能正常工作。忽略系统(“暂停”),它们是这样我可以检查我的输出。

#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 的解释是正确的,但是当我从二进制文件中读回时它是不正确的,当我在 textpad 中检查它时也是如此。

最佳答案

binslip.write是一个 UnformattedOutputFunction .有格式化和未格式化的输入/输出。当您使用无格式输出时,您是在将原始字节写入文件。没有关于字节实际代表什么的解释。

当您写信给 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如您所料。

关于c++ - Visual C++ - 将 double 和整数写入二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17872597/

相关文章:

c++ - 如何生成vcproj文件?

c++ - Visual C++ if 语句。当前不会命中断点

c++ - 编译器不应该对派生类中隐藏的基结构的成员变量发出警告吗?

C++Concurrency in action :Can the Listing7. 6(使用危险指针的 pop() 实现)真的检测到无法回收的节点吗?

visual-c++ - 未找到 Visual C++ 包含文件

c++ - 好奇的问题: What algorithm does STL set_intersect implement?

c++ - 是否可以使用互斥锁来锁定 vector 中的元素而不是整个 vector ?

c - 在 Win32 上双转换为 unsigned int 被截断为 2,147,483,648

c++ - 非静态和静态数据和函数

c++ - 在初始化中省略一个非平凡的复制/移动构造函数是否合法?