12

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

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

4

3 回答 3

23

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

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

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

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

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

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

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

于 2013-03-29T16:05:00.413 回答
3

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

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

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

于 2013-03-29T16:09:34.980 回答
1

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

于 2019-01-11T13:21:08.960 回答