C++ ifstream不能读取\n?

13

我正在尝试对文本文件每一行进行操作,但目前的方式是,我的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

就是那样。我不能改变它。


2
value 是什么数据类型?你可能想使用 value = cin.get() 而不是 cin >> value - Ben Voigt
如果你想读取行,请使用一个读取行的函数。通过“\n”,你真正意思的是一个行。 - David Schwartz
value是char类型,不能是任何类型的数组,那我应该使用什么?@DavidSchwartz,通过\n我真正意思是行末。 - PulsePanda
阅读有关 getline 的内容。 - Pete Becker
根据您的评论,Ben Voigt的评论应该可以解决您的问题。 - Drew Dormann
3个回答

25

>> 运算符执行的是“格式化输入操作”,这意味着它跳过空格等内容。

如果想逐个读取字符而不跳过空格等内容,您需要使用“未格式化输入操作”,例如 istream::get()。假设 value 的类型为 char,您可以使用 instream.get(value) 逐个读取每个字符。

当达到文件末尾时,读取将失败,因此您可以在循环中读取每个字符,例如:

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

然而,如果你想逐行读取,你可以将其读入一个std::string并使用std::getline

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

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


еҘҪзҡ„пјҢжҲ‘жҳҺзҷҪдҪ зҡ„ж„ҸжҖқгҖӮйӮЈд№Ҳvalueзҡ„еҖјдјҡжҳҜжҚўиЎҢз¬Ұ\nеҗ—пјҹ - PulsePanda
为什么不使用 getline 把整行读入一个 std::string 中呢?之后您可以随意解析该字符串,而无需再与 \n 打交道,因为正如 Jonathan 解释的那样,它已从 std::string 中剥离。 - Ionic
因为我无法将字符串用于赋值。根本不行。 - PulsePanda
具体是哪个作业? - Ionic
这段代码运行良好,应该会产生你想要的结果:http://ideone.com/UX6RJw(由于auto关键字,使用C++11) 输出:http://pastie.org/private/umsqfcnyh3fpgjx3obyzw - Ionic
显示剩余5条评论

3
您可以按照以下方式阅读您的文件:
 ifstream instream("file.txt);
 string line;
 while (instream >> line)
 {
    cout << line;
    if (instream.peek() == '\n') //detect "\n"
    {
       cout <<endl;
    }
 }
 instream.close();

这样你就可以追踪文件中每行的结尾并检测文件结尾。

@wbAnon 如果是这种情况,请参考“https://dev59.com/j2ct5IYBdhLWcg3wPbEm”获取一些信息。 - taocp
我知道如何逐个字符读取文件,问题在于它拒绝读取每行末尾的 \n 字符。 - PulsePanda
@wbAnon 尝试使用 fstream::get() 替代? - taocp

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接