此方法非常不好,容易造成输入输出流混乱,最好用fopen,fread,fwrite
freopen函数用于重定向输入输出流,freopen(file, "w",stdout)
用于将输出流定向到文件file,freopen(file, "r",stdin)
是从文件file读文件。
1 | FILE* fp = freopen("/home/user/Documents/test.txt","w",stdout); |
代码先将输出流定向到文件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
631
96
5
86
98
20
读其中数字的代码:1
2
3
4
5
6
7
8freopen(file, "r", stdin);
vector<int> data(6,0);
for(int i = 0; i < 6; ++i)
{
cin >> data[i];
cout << "data: " << data[i] ;
}
但是文件中有其他内容时,会读取失败,例如:
第4个元素赋值会成为0,值之后的数据都不正常