输入结束 getline

5

可能是重复问题:
为什么getchar()在Windows控制台中不能将返回识别为EOF?

我有一个简单的问题……假设我想从标准输入读取行,只要有内容,但是我不知道会有多少行。例如,我正在做学校作业,输入如下:

a
ababa
bb
cc
ba
bb
ca
cb

我不确定会有多少行,所以我试了一下

string *line = new string[100];
    int counter = 0;
   while(getline(cin,line[counter]))
   {
    counter++;
   }

但它不起作用...感谢帮助。

举个例子,我输入“aa”,回车,“bb”,回车,现在我什么都不输入,只是按下回车键,但没有任何反应...我需要在最后一个值被输入后结束从输入读取。 - user1751550
5个回答

4
如果您希望输入以空行结束,则需要进行测试。例如:

如果您想让输入以空行结束,则必须进行测试。例如:

string *line = new string[100];
int counter = 0;
while (getline(cin, line[counter]) && line[counter].size() > 0)
{
    counter++;
}

恭喜你正确使用了getline()。与你收到的一些答案不同。


1
如果您的计数器超过100,这将导致序列错误。对吗? - dreamcrash
@dreamcrash,是的。更好的代码是使用std :: vector <std :: string>push_back()将一行添加到向量中。但我喜欢逐步引入新内容。 - john
!line[counter].empty()line[counter].size() > 0更快。 - hinafu
2
@hinafu 你愿意在这个说法上打多少赌? :) - jrok
我不知道,当我在在线评测中得到TLE而不是AC时获得的金钱为零。 - hinafu

1
您可以使用类似以下的方式获取行数:
   string *line = new string[SIZE];
   int lines = 0;

    while(lines < SIZE && getline(cin, line[lines]) && line[lines].size() > 0) 
   {
        cout << input_line << endl;
        lines++;
   }

别忘了检查一下你是否添加了比字符串行可以处理的大小还要多的行数,否则可能会出现分段错误。


1
我能想到的最简单的行数计数器可能是这样的:
#include <string>
#include <iostream>

unsigned int count = 0;

for (std::string line; std::getline(std::cin, line); )
{
    ++count;
}

std::cout << "We read " << count << " lines.\n";

测试:

echo -e "Hello\nWorld\n" | ./prog

如果你想忽略空行,可以使用if (!line.empty()) { ++count; }


0

这应该可以工作:

int cont = 0;
string s;
while(cin >> s) { //while(getline(cin,s)) if needed
  if(s.empty()) break;
  ++cont;
}

0

你也可以使用文件结束标记来实现这个功能。它的用法如下所示。

std::ifstream read ("file.txt") ;

while(!read.eof())
{
  //do all the work
}

如果已经到达文件结尾,此函数将返回true。因此,它会一直继续执行,直到遇到文件结尾。

编辑:

正如评论中提到的那样,eof方法可能存在风险,并且不能提供所需的结果。因此,不能保证它在每种情况下都能运行。 您可以在此处查看有关可能发生这种情况的信息。

从文本文件读取直到EOF重复最后一行


2
这是一个极其危险的建议,通常会导致糟糕的代码。在合理或正确的方式下使用eof()几乎是不可能的。 - Kerrek SB
完全正确。由于 OP 有学校作业并且输入格式已经给出,我认为它很可能会运行良好。 - Coding Mash
1
教授这种可怕的想法给无辜者是更糟糕的——这就是为什么几乎所有有关于C++ I/O的 Stack Overflow 帖子都以同样的方式“错误”,即使是有“多年的C++经验”的人也不能做对这些东西。我们能做的最好的事情是从未向任何除最高级程序员之外的人提到 eof() 的存在。 - Kerrek SB
2
什么!这怎么会有三个赞成票?我给负一分。 - john

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