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,提问作者匿名用户
相关产品推荐
相关产品推荐

