如何从std::cin读取直到流结束
How to read from std::cin until the end of the stream?
我的问题是,我想从std::cin
读取输入,但不知道输入有多长。我也必须用char
,不能用std::string
。我要处理两件事a)用户输入文本,当他点击[ENTER]时,程序停止读取。b)用户将std::cin
重定向到一个文件(如.a.oput < file
),它可以容纳多行。
Edit:刚才注意到std::cin.eof()在读取文件的情况下也总是false。
对于a),我可以读取直到n出现。对于b) Edit: No(我可以读取,直到std::cin.eof()发生。)但是当我不知道我得到的是a)还是b)问题时,我该如何中断阅读过程呢?
这是我的a)…
char buffer = ' ';
while(std::cin >> std::noskipws >> buffer && buffer != 'n')
{
// do some stuff with buffer
}
…和b)
char buffer = ' ';
while(std::cin >> std::noskipws >> buffer)
{
// do some stuff with buffer
}
我也知道有std::cin.tellg()
来获取流中的当前位置。
Edit:因此,似乎在文件的情况下,输入流被终止,以std::cin >> std::noskipws >> buffer
获得false
的方式。上面的代码对a):
- 等待用户输入并按[ENTER] 然后循环用户在最后一行输入的每个字符。
- 然后它再次等待用户输入并按[ENTER]
- Infinite-waiting-processing-loop
我该怎么做呢?
您可以要求输入始终以EOF结束(意思是来自需要按下^D
的命令行),然后一如既往地使用b的过程。这样就可以从cmdline进行多行输入
您可以使用(旧的)getline函数,该函数接受一个指向字符数组的指针,并且可以使用分隔符。但是你不能保证在任何情况下它都能读到eof(因为字符缓冲区可能太小了),但是使用字符数组而不注意它的大小是非常危险的(从安全灾难的角度来看),因为它可能导致缓冲区溢出,这很容易被利用。
这段代码应该使您能够从输入中逐行提取:
char buffer[256];
while(getline(buffer,256,'n')) { //get a line
/* do something with the line */
}
读取最大字符数:
char buffer[256];
while(getline(buffer,256)) {//get a maximum amount out of the input
/* do something with the line */
}
相关文章:
- 读取二进制文件直到结束 c++
- 设置从文件中读取的开始和结束限制
- 在什么情况下,从流(结束)读取会导致停止?
- 结束标记 xml 验证在提升 ptree 读取 xml 中不正确
- C 读取输入,直到线char数组的结束
- 从 ifstream 读取,直到文件结束
- 输入文件读取错误的值,eof 控制循环不会结束
- C++:读取.BMP文件时出现问题;文件结束时间早于预期
- 如何读取整数直到线结束
- C 功能:读取直到文件结束 - 查找代码中的错误
- C++ 使用开始和结束读取文件的特定部分
- C++ 无法让 cin 从文件重定向中读取结束行字符
- 读取带引号的 CSV 数据,不带换行符作为结束行
- 当一个int的读取在C++中结束时
- 读取:ASIO中的文件结束.插座为什么要关上
- 结束函数,同时从该点继续读取文件
- c++如何用分隔符读取一行,直到每行结束
- 如何从std::cin读取直到流结束
- c++以二进制方式读取文件.文件结束的问题
- 到达文件结束后从文件中读取