【问题标题】:C++ - Missing end of line characters in file readC++ - 文件读取中缺少行尾字符
【发布时间】:2016-02-02 01:40:38
【问题描述】:

我正在使用 C++ 流读取目录中的一堆文件,然后将它们写入另一个目录。由于这些文件可能属于不同类型,因此我在读取/写入这些文件时使用通用 ios::binary 标志。 示例代码如下:

std::fstream inf( "ex.txt", std::ios::in | std::ios::binary);
char c;
while( inf >> c ) {
    // writing to another file in binary format
}

我遇到的问题是,对于包含文本的文件,这些文本文件中的行尾字符不会被写入输出文件。

编辑:或者至少它们看起来不像打开新写入的文件时那样,只有一个连续的字符行。

再次编辑:即使在文本模式下进行读/写,(连续字符串的)问题似乎仍然存在。

因此,我想知道是否有一种方法可以检查文件是否包含文本或二进制文件,然后适当地读/写它。否则,有什么方法可以在以二进制格式打开文件时保留行尾字符?

编辑:我使用的是 g++ 4.8.2 编译器

【问题讨论】:

  • newlines 没有被转移?你确定吗?我很确定这将严重偏离标准。二进制模式应按原样复制所有内容,包括文件中存在的任何换行符编码,LF/CRLF/LFCR/etc
  • 你用的是什么编译器?
  • 在上面添加了更多信息
  • 如果您只想在目录之间复制文件,您可以随时使用dest << src.rdbuf();。 (ps:记得在这样做之前src.clear(); src.seekg(0);
  • 在两种阅读模式下的行为相同(gcc 4.9.3) 作为一种解决方法,可以使用istream::get() 方法(刚刚检查过)。我不完全明白为什么,但似乎在使用>> 时,程序会尝试读取格式化的输入,而 文本模式 确实是这种情况,但我不知道为什么会这样实际上是二进制模式的情况。

标签: c++ io binary std fstream


【解决方案1】:

当你想操作字节时,你需要使用readwrite方法,而不是>><<操作符。

不过,您可以使用 inp.flags(inp.flags() & ~std::ios_base::skipws); 获得预期的行为。

【讨论】:

    猜你喜欢
    • 2019-07-05
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 2011-11-10
    • 2021-12-21
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多