C++二进制文件读写异常:写入整数读取获非预期值求助
解决二进制文件读写的不匹配问题
嗨,我来帮你搞定这个头疼的文件读写问题!你遇到的核心问题是写入和读取的方式不匹配——用文本模式的输出运算符写数据,却用二进制模式的read方法读,结果自然就乱了。
问题出在哪?
你写入代码里用的<<是ofstream的格式化文本输出运算符,它会把整数转换成人类可读的字符存在文件里:
- 写
0的时候,文件里存的是ASCII码0x30(也就是字符'0',占1字节) - 写
1的时候,文件里存的是ASCII码0x31(字符'1',占1字节)
但你读取的时候用read方法,直接按int的大小(通常是4字节)去读取二进制数据,这就会把文件里的这两个字节加上后面的垃圾数据(因为文件总共才2字节)拼成一个奇怪的整数,也就是你看到的12592。
正确的解决方法
要实现二进制读写,必须用write和read配对使用——write会直接把内存里的二进制数据原封不动写入文件,和read的操作完全对应。
修改你的写入代码:
int AccountNumber=0; ofstream FileCreator("Database.dat", ios::binary); // 用write替换<<,直接写入二进制数据 FileCreator.write(reinterpret_cast<const char*>(&AccountNumber), sizeof(AccountNumber)); AccountNumber=1; FileCreator.write(reinterpret_cast<const char*>(&AccountNumber), sizeof(AccountNumber)); FileCreator.close(); // 记得关闭文件,确保数据完全写入磁盘
你的读取代码其实是正确的,不过也可以加上关闭操作:
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; FileCreator.close();
额外提示:回到你的结构体读写需求
其实如果你的结构体里没有指针、std::string这类动态分配的成员,直接用write和read读写整个结构体是完全可行的,比如:
// 定义你的商店收费系统结构体 struct Transaction { int accountNum; double amount; int itemCount; }; // 写入结构体 Transaction trans{1001, 59.9, 2}; ofstream out("Database.dat", ios::binary); out.write(reinterpret_cast<const char*>(&trans), sizeof(trans)); // 读取结构体 Transaction readTrans; ifstream in("Database.dat", ios::binary); in.read(reinterpret_cast<char*>(&readTrans), sizeof(readTrans));
注意:如果之前用旧代码生成过Database.dat,记得先删掉它,不然文件里的残留数据可能会影响新的读取结果哦!
内容的提问来源于stack exchange,提问作者user10429212
相关产品推荐
相关产品推荐

