【问题标题】:Ifstream stops reading file after a few linesIfstream 在几行后停止读取文件
【发布时间】:2019-11-14 11:30:12
【问题描述】:

我正在使用 ifstreamstringstream 来读取文件,但它在几行后停止...

string read(string filename)
{
    ifstream inFile;
    inFile.open(filename);
    stringstream strStream;
    strStream << inFile.rdbuf();
    inFile.close();
    string str = strStream.str();
    return str;
}

此代码在 'zh¬' 之后停止
我在想也许它们是 ascii 表中的控制字符,它停止后的第一个字符是 26。
但我不认为这很重要。

【问题讨论】:

  • 您要读取什么样的文件?是二进制文件吗?一个文本文件?如果它是您以文本模式(默认)打开的二进制文件,那么在 Windows 上,字节 26 被视为 EOF(它对应于 Ctrl-Z)。
  • 你的代码看起来没问题,只要确保它是一个 ASCII 文件。提供文件的扩展名。
  • @seccpur 文件扩展名无关紧要。

标签: c++ file visual-c++


【解决方案1】:

您的ifstream 正在以文本模式打开。尝试以二进制模式打开文件: std::ifstream inFile(filename, std::ios::binary);

文本流是组成行的有序字符序列(零个或多个字符加上终止的'\n')。最后一行是否需要终止 '\n' 是实现定义的。可能必须在输入和输出中添加、更改或删除字符以符合在操作系统中表示文本的约定(特别是,Windows 操作系统上的 C 流在输出时将 \n 转换为 \r\n,然后将 \r \n 到 \n 输入)

  • 仅当满足以下所有条件时,才能保证从文本流中读取的数据与之前写入该流的数据相比较:
    数据仅由打印字符和控制字符 \t 和 \n 组成(特别是在 Windows 操作系统上,字符 '\0x1A' 终止输入)

  • 没有 \n 前面紧跟一个空格字符(在 \n 之前写出的空格字符在读取时可能会消失)

  • 最后一个字符是\n

二进制流是可以透明地记录内部数据的有序字符序列。从二进制流中读取的数据始终等于之前写入该流的数据。实现只允许在流的末尾附加一些空字符。宽二进制流不需要以初始移位状态结束。

https://en.cppreference.com/w/cpp/io/c#Binary_and_text_modes

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    相关资源
    最近更新 更多