在C++中读写整数到二进制文件

10
我不清楚如何读取长整数。如果我说:
long int a[1]={666666}
ofstream o("ex",ios::binary);
o.write((char*)a,sizeof(a));

将值存储到文件中,并希望按原样读取它们

long int stor[1];
ifstream i("ex",ios::binary);
i.read((char*)stor,sizeof(stor));

我该如何使用字符数组中存储的信息来显示相同的数字?

1
你能具体说一点吗? - Alexey Frunze
我想学习如何读取存储在二进制文件中的整数值[4个字节]。 - user2097891
5
你的代码已经在做这件事了吗? - Alexey Frunze
2个回答

12

o.write 不是写入字符,而是写入字节(如果使用了 ios::binary 标志)。使用 char 指针是因为 char 的长度为 1 字节。

o.write((char*)a,sizeof(a)); 

"

(char*) ao.write 应该写入的地址。然后它会将 sizeof(a) 个字节写入文件中。没有字符存储,只有字节。

如果 aint i = 10,那么在十六进制编辑器中打开该文件时,您会看到类似于以下内容:0A 00 00 00(4个字节,在x64上)。

读取是类似的。

这里是一个可行的示例:

"
#include <iostream>
#include <fstream>
#include <string>

using namespace std;


int main (int argc, char* argv[]){
    const char* FILENAM = "a.txt";
    int toStore = 10;
    ofstream o(FILENAM,ios::binary);

    o.write((char*)&toStore,sizeof(toStore));
    o.close();

    int toRestore=0;
    ifstream i(FILENAM,ios::binary);
    i.read((char*)&toRestore,sizeof(toRestore));

    cout << toRestore << endl;


    return 0;
}

1
你好,我遇到了问题。如果不使用二进制标志来标记文件对象会发生什么? - Darktega
1
我认为当在大端机器上读取由小端系统生成的文件或反之亦然时,这会导致错误。 - SWdV

-4

抱歉我花了这么长时间才看到你的问题。

我认为二进制和非二进制(即文本)模式之间的区别在于,二进制将按原样读取和写入文件。但是非二进制模式会使用回车符“\r”修复换行符“\n”的结尾。修复会在“\n”和“\r”之间来回更改,或者是“\n\r”或“\r\n”,或者保留为“\n”。它的作用取决于目标操作系统是Mac、Windows、Unix等。

我认为如果您正在读写整数,它将正确地读取和写入您的整数,并且看起来是正确的。但是,如果整数的某些字节看起来像“\r”和“\n”,那么从文件中读取整数时,整数将无法正确读回。

二进制确保读回int始终是正确的。但是,您希望文本模式格式化文件以便在文本编辑器(如Windows的记事本)中阅读。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接