我正在用C ++编写文件,如下所示:
void TestExportWriteOut()
{
const auto filePath = R"(C:\TestOut.bin)";
ofstream outFile(filePath, ios::out | ios::binary);
outFile<< 1;
outFile.flush();
outFile.close();
}
并尝试以C#读取它:
[TestMethod]
public void LoadTestOut()
{
const string filePath = "C:\\TestOut.bin";
using (var fileStream = File.OpenRead(filePath))
using (var reader = new BinaryReader(fileStream))
{
var intOne = reader.ReadInt32(); //!!Throws Exception
Assert.AreEqual(intOne, 1);
}
}
但是,就在我尝试读取整数值1的那一行,我得到一个异常提示:
System.IO.EndOfStreamException:“无法读取超出流末尾的位置。”
读取C#中使用ofstream
在C ++中创建的文件的正确方法是什么?
我可以在文件系统上看到C ++创建的文件,尽管我写的只是一个int,但其大小为1KB。
答案 0 :(得分:1)
ios::binary
标志不会执行您认为的(*)。它不会影响operator<<(int)
的行为,而该行为仍将其参数置于文本表示中。在C ++方面,使用outFile.write()
输出二进制表示形式(与ios::binary
标志一起使用)。
(*)确实以OS的二进制文件形式打开文件,该OS的二进制文件概念与文本文件不同(Windows和Unix都不在该类中),并且它阻止了\n
在表示操作系统行尾的常规方法(Windows为此使用一对字符,这就是为什么需要ios::binary
标志的原因)