【问题标题】:using ofstream writes binary without the ios::binary flag C++使用 ofstream 写入没有 ios::binary 标志 C++ 的二进制文件
【发布时间】:2016-04-30 07:57:11
【问题描述】:

我有几个std::vector 长度为Nlong, string, double 类型。我正在尝试以这种方式将其写入纯文本文件:

int N = 100;
std::vector<std::string> var1String(N), var2String(N), var3String(N), var4String(N);
std::vector<long> var1Long(N);
std::vector<double> var1Double(N);

...

 std::ofstream f(path2file);
      for(int i=0; i<N; i++)
    {
f << var1String[i] << " " << var2String[i] << " " << var1Long[i] << " " << var3String[i] << " " << var1Double[i] << " " << var4String[i] << std::endl;
}

虽然我没有使用ios::binary flag,但它是以二进制形式编写的,我可以在 linux 中轻松读取。但是我想把它写成一个纯 ASCII 文本文件。 (注意:我也尝试过将var1Long[i]var1Double[i] 转换为字符串而没有任何区别)。我做错了什么?

编辑:它是一个更大的程序的一部分,它从服务器获取一些输出到 ASCII 中的向量。正如我所说,当使用 linux 读取二进制文件或使用std::cout 而不是f 运行程序时,它打印得很好。我只是不明白是什么导致流作为二进制传递。

【问题讨论】:

  • 你能发布一个示例输出吗? (十六进制,ASCII)
  • 无法重现,这只是创建一个文本文件? - 请发布实际代码来重现问题,这甚至无法编译(varLong1 未声明)

标签: c++


【解决方案1】:

你认为ios::binary 会做什么?

作为«What's the difference between opening a file with ios::binary or ios::out or both?»中的explained by Nick Bedford

ios::binary 确保读取或写入数据而无需在运行中将换行符与 \r\n 进行转换。换句话说,你给流提供的正是所写的。

它确实标记二进制内容的文件,它只是避免将C换行转换为它们的文本表示。因此,它的缺失不会阻止文件包含二进制数据。

简而言之:您在文件中获得二进制数据,因为您的“字符串”变量确实包含二进制数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多