C++ fstream写入文件出现空值或垃圾数据问题求助
C++文件读写异常问题的解决
核心错误点
- 读取文件时错误使用写入模式:用
ifstream打开文件时添加了std::ios::out,这会直接清空目标文件,导致无法读取之前写入的内容。ifstream默认是只读模式,完全不需要加out标记。 - 冗余的打开模式标记:写入和读取操作都重复写了两次
std::ios::out,属于无效冗余代码。 - 字符输出的可视化盲区:用
<<直接输出char类型的1,这是ASCII控制字符(SOH),控制台不会显示可见内容,并非没有写入。 - 二进制数据的错误输出方式:用
cout << dateir2.rdbuf()直接输出二进制文件内容,其中包含不可见字符和二进制值,看起来像空或垃圾数据是正常现象。
修正后的代码
#include <iostream> #include <vector> #include <fstream> #include <iomanip> // 用于格式化十六进制输出 using namespace std; int main() { std::vector<char> y(6, 0); y[0] = 1; std::vector<std::vector<char>> vy; vy.push_back(y); // 修正:去掉重复的ios::out,保留二进制写入模式,增加打开失败判断 std::fstream dateir("ffff.dat", std::ios::out | std::ios::binary); if (!dateir.is_open()) { cout << "写入文件打开失败" << endl; return 1; } // 转成int输出可见数值,避免控制字符无法显示 dateir << static_cast<int>(vy[0][0]) << endl; int temp = vy[0][0]; dateir.write(reinterpret_cast<char*>(&temp), sizeof(int)); dateir.close(); cout << "here" << endl; // 修正:ifstream使用只读模式(默认ios::in),去掉错误的ios::out,保留二进制读取 std::ifstream dateir2("ffff.dat", std::ios::in | std::ios::binary); if (dateir2.is_open()) { // 读取文本格式的数值 int text_val; dateir2 >> text_val; cout << "读取到的文本值:" << text_val << endl; // 读取二进制格式的数值 int bin_val; dateir2.read(reinterpret_cast<char*>(&bin_val), sizeof(int)); cout << "读取到的二进制值:" << bin_val << endl; // 以十六进制查看原始二进制数据 cout << "原始二进制数据(十六进制):" << endl; dateir2.seekg(0); // 回到文件开头 char c; while (dateir2.get(c)) { cout << hex << setw(2) << setfill('0') << static_cast<unsigned int>(static_cast<unsigned char>(c)) << " "; } cout << dec << endl; // 恢复十进制输出 } else{ cout << "读取文件打开失败" << endl; } dateir2.close(); cout << "end"; return 0; }
关键说明
- 文件打开模式必须匹配操作类型:写入用
ios::out,读取用ios::in(ifstream默认自带),二进制操作必须加ios::binary避免系统自动转换换行符。 - 输出
char类型的控制字符时,要强制转换为int才能看到实际数值,否则控制台不会显示内容。 - 读取二进制文件时,要按写入的格式对应读取,不要直接用
rdbuf()输出到控制台,如需查看原始数据,建议转成十六进制格式。
内容的提问来源于stack exchange,提问作者proton
相关产品推荐
相关产品推荐

