写代码需要读文件,图方便直接用了freopen重定向输入流,后面发现控制台不响应system("pause"),希望在控制台看到的结果还没看清就闪退了;
原因:重定向输入流后,系统只响应来自文件的输入,system("pause"),cin.get();这些的输入都来自文件,所以系统自动跳过去了
解决办法:用freopen("CON", "r", stdin); 这句来改回去,清除cin的错误代码,
//将重定向的标准输入还原,养成好习惯
freopen("CON", "r", stdin);//将标准输入重定向为 CON 控制台
cin.clear();//清除cin中的错误,恢复为默认状态
使用中也证实,在直接用freopen重定向输入或输出流的情况下,使用完成应该及时将其恢复到默认状态,否则会影响程序的后续运行;
示例如下:(这里只重定向了输入流,输出流同理)
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
using namespace std;
//将文本中的文字全部读出,并显示出来
void test01()
{
int c;
freopen("test.txt", "r", stdin); //将标准输入重定向为 test.txt
while ((c = cin.get())!= EOF)
cout.put(c);
//将重定向的标准输入还原,养成好习惯
freopen("CON", "r", stdin);//将标准输入重定向为 CON 控制台
cin.clear();//清除cin中的错误,恢复为默认状态
}
//整行读取
const int MAX_LINE_LEN = 10000; //假设文件中一行最长 10000 个字符
void test02()
{
char szBuf[MAX_LINE_LEN + 10];
freopen("test.txt", "r", stdin); //将标准输入重定向为 test.txt
while (cin.getline(szBuf, MAX_LINE_LEN + 5))
cout << szBuf << endl;
//将重定向的标准输入还原,养成好习惯
freopen("CON", "r", stdin);//将标准输入重定向为 CON 控制台
cin.clear();//清除cin中的错误,恢复为默认状态
}
int main()
{
test01();
test02();
//为了保证在程序结束之前能够看到控制台内容,并将程序暂停
freopen("CON", "r", stdin);//将标准输入重定向为 CON 控制台
cin.clear();//清除cin中的错误,恢复为默认状态
cout << endl << endl << "程序结束,按回车退出" << endl;
cin.get();
return 0;
}
运行结果:(同一个文件,读取两次,都显示到控制台)
为保证文件输出中文,编码一定要ANSI ,其他可能会乱码