【问题标题】:C++ ifstream not reading \n?C++ ifstream 没有读取\n?
【发布时间】:2013-03-20 08:42:45
【问题描述】:

我正在尝试对文本文件的每行进行操作,而我现在的方式是,我的 ifstream 对象没有检测到每一行的 \n 字符,这是此操作所必需的项目。这是我现在的方式:

std::ifstream instream;
instream >> value;
while (value != '\n')
{
    // do code and such
}

但是当我让它运行循环时,我得到的只是程序中所有内容的一行。虽然它在循环中完全按照它应该做的那样做,但我需要\n 才能被识别。这是我的.txt 文件:

LXXXVII
cCxiX
MCCCLIV
CXXXLL
MMDCLXXIII
DXLCC
MCdLxxvI
XZ
X
IV

就是这样。我无法改变它。

【问题讨论】:

  • value 是什么数据类型?您可能想使用value = cin.get() 而不是cin >> value
  • 如果要读取行数,请使用读取行数的函数。 “\n”,真正的意思是 empty 行。
  • value 是 char 类型,它不能是任何类型的数组,那么我将使用什么来代替?和@DavidSchwartz,\n 我真的是指行尾。
  • 了解getline
  • @wbAnon 根据您的评论,Ben Voigt 的评论应该可以解决您的问题。

标签: c++ text project newline ifstream


【解决方案1】:

>> 运算符执行“格式化输入操作”,这意味着(除其他外)它会跳过空格。

要在不跳过空格的情况下逐个读取原始字符,您需要使用“未格式化的输入操作”,例如istream::get()。假设valuechar 类型,您可以使用instream.get(value) 读取每个字符

当您到达 EOF 时,读取将失败,因此您可以读取循环中的每个字符,例如:

while (instream.get(value))
  // process value

但是,要逐行阅读,您可以读入 std::string 并使用 std::getline

std::string line;
while (getline(instream, line))
  // ...

这是一个未格式化的输入操作,它将直到 \n 的所有内容读入字符串,然后丢弃 \n 字符(因此您需要在每个 erad 行之后手动附加一个 \n 以重建原始输入)

【讨论】:

  • 好吧,我知道你是从哪里来的。那么我会得到一个 \n 作为value 的值吗?
  • 当使用instream.get(value) 是,假设valuechar 类型
  • 好的,代码instream.get(value) 没有给\n 赋值。知道为什么吗?
  • 为什么不直接用 getline 将整行读入 std::string 呢?之后您可以随意解析字符串,而无需使用 \n 进行模糊处理,因为它已从 std::string 中剥离,正如 Jonathan 解释的那样。
  • 因为我不能使用字符串进行分配。完全
【解决方案2】:

您可以按如下方式读取文件:

 ifstream instream("file.txt);
 string line;
 while (instream >> line)
 {
    cout << line;
    if (instream.peek() == '\n') //detect "\n"
    {
       cout <<endl;
    }
 }
 instream.close();

这样您可以跟踪文件中的行结束位置并检测文件的结尾。

【讨论】:

  • @wbAnon 如果是这种情况,请参阅“stackoverflow.com/questions/12240010/…”了解一些信息
  • 我知道如何让它逐个字符地读取文件,问题是它拒绝读取每行末尾的 \n 字符。
  • @wbAnon 尝试使用 fstream::get() 代替吗?
【解决方案3】:

我猜你正在寻找这个: instream.unsetf(std::ios_base::skipws)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-26
    • 1970-01-01
    • 2016-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多