标准输入 while 循环不会退出 C++
Standard input while loop won't exit c++
我正在尝试从标准输入([a.out < text.txt] 在 unix 中读取),并且我使用了以下两个代码块:
int main(){
while (!cin.eof()){ReadFunction()}
OutputFunction();}
和
int main(){
char c;
while (cin.getchar(c)){ReadFunction()}
OutputFunction();}
这两个循环都正确执行了读取函数,但都没有退出循环并执行输出函数。如何从标准输入中逐个字符地读取,然后执行输出函数?
cin.eof()
众所周知是不可信的。如果经常 return 一个不准确的结果。无论哪种方式,建议您从文件中复制所有数据(您说的是标准输入),然后从中获取字符。我建议使用 std::stringstream 来保存文件中的数据,然后使用 std::getline()。我没有 Unix 编程经验,但您通常可以尝试这样的操作:
#include <string>
#include <sstream>
#include <iostream>
int main() {
std::string strData;
std::stringstream ssData;
while (std::getline(in /*Your input stream*/, strData))
ssData << strData;
ssData.str().c_str(); // Your c-style string
std::cout << (ssData.str())[0]; // Write first char
return 0;
}
至于为什么你的 while 循环不退出可能与实现有关,但你可以考虑将其作为替代方案。
我认为这可能是您的 ReadFunction() 中的问题。如果您不读取字符,流将不会前进并且会陷入循环。
以下代码有效:-
#include <iostream>
#include <string>
using namespace std;
string s;
void ReadFunction()
{
char a;
cin >> a;
s = s + a;
}
void OutputFunction()
{
cout <<"Output : \n" << s;
}
int main()
{
while (!cin.eof()){ReadFunction();}
OutputFunction();
}
我能想到的最简单的方法是使用类似下面的方法
#include <cstdio>
int main() {
char c;
while((c = getchar()) != EOF) { // test if it is the end of the file
// do work
}
// do more work after the end of the file
return 0;
}
与您的唯一真正区别是,上面的代码测试 c
以查看它是否是文件末尾。然后像 ./a.out < test.txt
这样的东西应该可以工作。
我正在尝试从标准输入([a.out < text.txt] 在 unix 中读取),并且我使用了以下两个代码块:
int main(){
while (!cin.eof()){ReadFunction()}
OutputFunction();}
和
int main(){
char c;
while (cin.getchar(c)){ReadFunction()}
OutputFunction();}
这两个循环都正确执行了读取函数,但都没有退出循环并执行输出函数。如何从标准输入中逐个字符地读取,然后执行输出函数?
cin.eof()
众所周知是不可信的。如果经常 return 一个不准确的结果。无论哪种方式,建议您从文件中复制所有数据(您说的是标准输入),然后从中获取字符。我建议使用 std::stringstream 来保存文件中的数据,然后使用 std::getline()。我没有 Unix 编程经验,但您通常可以尝试这样的操作:
#include <string>
#include <sstream>
#include <iostream>
int main() {
std::string strData;
std::stringstream ssData;
while (std::getline(in /*Your input stream*/, strData))
ssData << strData;
ssData.str().c_str(); // Your c-style string
std::cout << (ssData.str())[0]; // Write first char
return 0;
}
至于为什么你的 while 循环不退出可能与实现有关,但你可以考虑将其作为替代方案。
我认为这可能是您的 ReadFunction() 中的问题。如果您不读取字符,流将不会前进并且会陷入循环。
以下代码有效:-
#include <iostream>
#include <string>
using namespace std;
string s;
void ReadFunction()
{
char a;
cin >> a;
s = s + a;
}
void OutputFunction()
{
cout <<"Output : \n" << s;
}
int main()
{
while (!cin.eof()){ReadFunction();}
OutputFunction();
}
我能想到的最简单的方法是使用类似下面的方法
#include <cstdio>
int main() {
char c;
while((c = getchar()) != EOF) { // test if it is the end of the file
// do work
}
// do more work after the end of the file
return 0;
}
与您的唯一真正区别是,上面的代码测试 c
以查看它是否是文件末尾。然后像 ./a.out < test.txt
这样的东西应该可以工作。