You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 03:24:38