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

C++ ofstream写入文件在C#中读取异常,求正确读取方法

解决C#读取C++ ofstream生成文件时的EndOfStreamException问题

咱先把问题根源说透:你遇到的异常完全是因为C++写入数据的格式和C#读取的格式不匹配,跟文件显示的1KB大小没关系(那是文件系统簇大小导致的磁盘占用,实际有效内容只有1字节)。

问题原因拆解

  • 在你的C++代码里,outFile << 1;是文本模式写入:它把整数1转换成了ASCII字符'1'(对应字节值0x31),只写了1个字节到文件里。
  • 而C#的reader.ReadInt32()是读取4字节的二进制整数(按照系统端序,通常是小端模式),需要文件里至少有4字节数据,现在只有1字节,自然会抛出EndOfStreamException。

两种解决方案

方案一:修改C++代码,以二进制格式写入整数

这是最规范的跨语言二进制交互方式,保证写入的是真正的二进制int数据:

void TestExportWriteOut() { 
    const auto filePath = R"(C:\TestOut.bin)"; 
    ofstream outFile(filePath, ios::out | ios::binary); 
    int value = 1;
    // 直接写入int的二进制字节内容,sizeof(int)通常是4字节
    outFile.write(reinterpret_cast<const char*>(&value), sizeof(value)); 
    outFile.flush(); 
    outFile.close(); 
}

修改后,C#原有的ReadInt32()代码就能正常读取到整数1了。

方案二:如果不能修改C++代码,修改C#代码读取文本格式

如果C++那边的代码没法改,那就适配它的文本写入方式,读取文件里的字符再转换成整数:

[TestMethod] 
public void LoadTestOut() { 
    const string filePath = "C:\\TestOut.bin"; 
    // 读取文件的文本内容
    string content = File.ReadAllText(filePath);
    if(int.TryParse(content, out int intOne))
    {
        Assert.AreEqual(intOne, 1);
    }
    else
    {
        Assert.Fail("无法解析文件中的整数");
    }
}

或者用StreamReader逐字符读取:

[TestMethod] 
public void LoadTestOut() { 
    const string filePath = "C:\\TestOut.bin"; 
    using (var fileStream = File.OpenRead(filePath))
    using (var reader = new StreamReader(fileStream))
    {
        string content = reader.ReadToEnd();
        if(int.TryParse(content, out int intOne))
        {
            Assert.AreEqual(intOne, 1);
        }
        else
        {
            Assert.Fail("无法解析文件中的整数");
        }
    }
}

内容的提问来源于stack exchange,提问作者匿名用户

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:45:35