fstream的怪异问题。无法存储具有成员变量具有特定值的对象

Zoh*_*ule 1 c++ fstream turbo-c++

当我尝试将一个对象与任何具有13或26或7值的元素存储在一起,然后尝试读取此文件时,它只是给出了垃圾值。其他值(例如1、64、78(随机值))则不会发生这种情况。

我分别使用了ofstream和ifstream来保持代码简单。我正在使用旧的编译器(Borland C ++),但是我的朋友们没有遇到此错误。

#include <iostream.h>
#include <conio.h>
#include <fstream.h>

class xyz
{
  public:
    int x;
};

void main()
{
    xyz a;
    a.x = 45; // replace by 45 or 78 it works. Replace by 13, 26 it shows garbage values.

    ofstream of;
    of.open("file.dat", ios::out||ios::binary);
    of.write((char*)&a, sizeof(a));
    of.close();

    xyz b;

    ifstream sf;
    sf.open("file.dat", ios::in||ios::binary);
    sf.read((char*)&b, sizeof(b));
    sf.close();

    cout<<b.x;
    getch();
}
Run Code Online (Sandbox Code Playgroud)

当前输出将是45,但是如果将其替换为13或26,它将返回垃圾值。

Sam*_*hik 9

sf.open("file.dat", ios::in||ios::binary);
Run Code Online (Sandbox Code Playgroud)

||不按照您的想法去做。在这里,您需要使用按位或运算符|,而不是||逻辑运算符。

结果,由于这个错误,文件实际上是以文本模式而不是您期望的二进制模式打开的。

您的代码将二进制八位位组13和26写入文件并读回。八位位组13和26在Microsoft Windows上的文本文件中具有特殊含义,这是由于其历史悠久的缘故。您的代码也无法检查来自read()输入流的返回值和/或输入流的状态,这将使您能够检测到此错误。