用freopen函数操作输入输出流和读写文件
此方法非常不好,容易造成输入输出流混乱,最好用fopen,fread,fwrite



freopen函数用于重定向输入输出流,freopen(file, "w",stdout)用于将输出流定向到文件file,freopen(file, "r",stdin)是从文件file读文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
FILE* fp = freopen("/home/user/Documents/test.txt","w",stdout);
srand((int)time(NULL));
for(int i=0;i<8;i++)
{
int num = rand()%100;
string s = boost::lexical_cast<string>(num);
cout << s << endl;
}
// fclose(stdout);
freopen("/dev/tty", "w", stdout);

// 在终端运行会输出,在IDE里不会输出
cout<<"**************"<<endl;

代码先将输出流定向到文件test.txt,后面的cout<<s<<endl会将几个随机数写入到文件。
如果之后直接fclose(stdout),之后的cout输出肯定不管用,此时把输出流关了,对终端和文件都无法输出了。

在使用完freopen之后,如果还需要使用标准输入输出,不能把它们直接fclose,不妨再次重定向,把stdin、stdout重定向到控制台,就能从键盘接受输入、从屏幕输出。在linux中,控制台设备是/dev/tty,所以再次调用freopen。最后的星号只能在终端执行可执行文件时,才会输出。

以上函数对log4cpp的日志和ROS_INFO也有影响,显然log4cpp的本质也是操作输出流,与freopen相同。

读文件

比如文件内容如下:

1
2
3
4
5
6
31
96
5
86
98
20

读其中数字的代码:

1
2
3
4
5
6
7
8
freopen(file, "r", stdin);
vector<int> data(6,0);

for(int i = 0; i < 6; ++i)
{
cin >> data[i];
cout << "data: " << data[i] ;
}

但是文件中有其他内容时,会读取失败,例如:

第4个元素赋值会成为0,值之后的数据都不正常