好吧,所以我在大学第二学期的即时通讯已经完成了c并现在正在执行c ++ 在DevC中完成项目。
当前,我正在制作一个程序,该程序将在拥有和编辑数据库的同时执行商店的收费过程。
尝试编写和读取完整的结构但很复杂的工作,所以我放弃写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。
答案 0 :(得分:1)
要完成@Thomas Matthews的回答
但是为什么重要呢? <<在二进制文件中写的方式与.write的方式不同吗?
在Windows之外您不会看到任何区别,在Windows下,如果以二进制模式打开文件,则\ n会保存/读取不变,否则写入\n
会产生\r\n
并读取{{1 }}返回\c\n
。就像 fopen 的“ r” /“ rb”和“ w” /“ wb”之间的区别一样。
您可以混合使用运算符\n
和是否以二进制模式进行读/写,但是您必须注意分隔符,例如:
<</>>
编译和执行(Windows以外):
#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下,所以要使用二进制模式或什么都不更改,这两个文件是相同的
答案 1 :(得分:0)
对于写入二进制文件,请使用std::ostream::write()
方法,而不要使用operator<<
:
FileCreator.write((char *) &AccountNumber, sizeof(AccountNumber));
强制转换是必需的,因为没有将整数写入流的重载。
请记住,read
和write
已配对为二进制I / O。
编辑1:固定长度和可变长度记录
请注意,在读写时,您需要该商品的 size 。这将适用于固定大小/长度的数据项和结构。但是,它不适用于可变长度的数据(例如文本)。
对于可变长度记录,您可能要先写长度,然后写数据:
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(在编写控制台和其他人类可读流时使用的是习惯用语)。