在c ++中读取和写入二进制文件

时间:2013-02-22 06:03:24

标签: c++ visual-c++ file-io

我不清楚阅读长整数是如何工作的。如果我说

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));

如何使用存储在字符数组的多个字节中的信息显示相同的数字?

2 个答案:

答案 0 :(得分:10)

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

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

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

如果您在十六进制编辑器中打开文件,如果是int 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 :(得分:-2)

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

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

我认为如果你正在读写一个整数,它会读取和写出你的整数,它看起来是正确的。但是如果整数的某些字节看起来像'\ r'和'\ n',则整数将无法从文件中正确读回。

Binary确保读回int总是正确的。但是,您希望文本模式格式化要在文本编辑器(如Windows的记事本)中读取的文件。