C ++二进制读写文件

问题描述 投票:0回答:2

好吧所以即时通讯在我大学的第二学期已经完成了c并且正在做C ++,现在在Dev C中完成这个项目。

目前我正在制作一个程序,用于在拥有和编辑数据库的同时进行商店的收费过程。

尝试写和阅读一个完整的结构但非常有效,所以我写了2个int数字并阅读它们但这也很有效,而在阅读时获取随机数,即使我写了txt数字似乎没问题。

//write and read are different fucntion only 1 is called .
//file creation code
int AccountNumber=0;
ofstream FileCreator("Database.dat",ios::binary);   
FileCreator<<AccountNumber;
AccountNumber=1;
FileCreator<<AccountNumber;

//reading code

int AccountNumber=0;
ifstream FileCreator("Database.dat",ios::binary);
FileCreator.seekg(0,ios::beg);

FileCreator.read(reinterpret_cast<char*>(&AccountNumber), sizeof(AccountNumber));
cout<<AccountNumber<<endl;
FileCreator.read(reinterpret_cast<char*>(&AccountNumber), sizeof(AccountNumber));
cout<<AccountNumber<<endl;

我期望输出0和1,但得到12592和12592。

c++ file binary
2个回答
1
投票

完成@Thomas Matthews的答案

但为什么重要呢? <<以不同的方式写出.write在二进制文件中?

如果文件在二进制模式下打开,在windows下,你将看不到差异,在Windows下\ n保存/读取不变,否则写入\n会产生\r\n并且读取\c\n会返回\n。它就像fopen的“r”/“rb”和“w”/“wb”之间的区别。

您可以混合运算符<</>>的使用和二进制模式下的读/写,但您必须处理分隔符,例如:

#include <iostream>
#include <fstream>

using namespace std;

int main()
{
  int AccountNumber = 123;

  {
    ofstream bin("bin",ios::binary);   

    bin << AccountNumber << '\n'; // a \n to finish the number allowing to read it later
    bin.write((char *) &AccountNumber, sizeof(AccountNumber));
  }
  {
    ofstream txt("txt");   

    txt << AccountNumber << '\n';
    txt.write((char *) &AccountNumber, sizeof(AccountNumber));
  }
  {
    ifstream bin("bin",ios::binary);

    AccountNumber = 0;
    bin >> AccountNumber;
    cout << AccountNumber << endl;

    // I have to read the \n with read() because >> bypass it.
    // Supposing I written '@' rather than '\n' `bin >> c;` can be used
    char c;

    bin.read(&c, 1);
    cout << (int) c << endl;

    AccountNumber = 0;
    bin.read((char *) &AccountNumber, sizeof(AccountNumber));
    cout << AccountNumber << endl;
  }

  return 0;
}

编译和执行(在Windows之外):

pi@raspberrypi:/tmp $ g++ -pedantic -Wextra -Wall f.cc
pi@raspberrypi:/tmp $ ./a.out
123
10
123
pi@raspberrypi:/tmp $ cmp txt bin
pi@raspberrypi:/tmp $ 

我不是在Windows下,所以使用二进制模式或不更改任何东西,这两个文件是相同的


0
投票

要编写二进制文件,请使用std::ostream::write()方法,而不是operator<<

FileCreator.write((char *) &AccountNumber, sizeof(AccountNumber));

强制转换是必要的,因为没有重载将整数写入流。

请记住,readwrite配对二进制I / O.

编辑1:固定长度和可变长度记录 请注意,在写作和阅读时您需要物品的大小。这适用于固定大小/长度的数据项和结构。但是,它不适用于可变长度数据,例如文本。

对于可变长度记录,您可能希望先写入长度,然后再写入数据:

static const char hello[] = "Hello";
static const unsigned int data_size(sizeof(hello) - 1);
FileCreator.write((char *) &data_size, sizeof(data_size));
FileCreator.write(&hello[0], data_size);

在上面的示例中,“ - 1”存在,因此终止NUL字符不会写入文件。你不需要这个二进制文件,但YMMV(我在写入控制台和其他人类可读流时使用这个习惯用法)。

© www.soinside.com 2019 - 2024. All rights reserved.