在C++中输入输出到指定文件,或者从指定文件中读出数据使用fstream类较为方便。
1.将数据写到磁盘的指定文件中
首先第一步是加头文件#include <fstream>,引入库函数
第二步,声明一个ofstream对象,调用ofstream的成员函数open函数,与指定的文件相关联
第三步,使用<<向文件中写入数据,注意<<操作符已经在库函数里重载过,所以直接调用即可。
最后一步,关闭输出流,调用close()函数
#include <iostream>
#include <fstream>
using namespace std;
int main(){
ofstream outfile;
outfile.open("D:\\data.txt");
outfile<<"随机产生的序列:"<<endl;
for(int i=0;i<10;i++){
outfile<<i<<endl;
}
outfile.close();
return 0;
}
在D盘data.txt文件中,应该是这样的效果:
注意,这里的data.txt文件可以提前创建,当然也可以有程序自动创建,也就是说当程序执行到该步时,发现该目录下没有该文件,那么会自动地生成一个文本文件。
在这里有时候会出现这样的问题,当我的代码是这样的:
#include <iostream>
#include <fstream>
using namespace std;
int main(){
ofstream outfile;
outfile.open("D:\\data.txt");
outfile<<"随机产生的序列:"<<endl;
for(int i=0;i<10;i++){
outfile<<i<<" "; //注意这行与上面的区别
}
outfile.close();
return 0;
}
本意是想将数字横着输出一行,那么到底有没有实现这样的功能呢?
这里要分情况,如果是Dev或者其他比较流行的编译器,是没有任何问题的,效果如下:
但如果是Microsoft visual 6.0这种比较老式的编译器,就会出现这样的情况:
很明显,数字不见了。在此声明,这种情况只会在比较老式的编译器中出现。
原因是要写入的数据在缓冲区内,还没有保存到文本中,解决办法是写完之后刷新一次,调用flush()函数来清空缓冲区。
#include <iostream>
#include <fstream>
using namespace std;
int main(){
ofstream outfile;
outfile.open("D:\\data.txt");
outfile<<"随机产生的序列:"<<endl;
for(int i=0;i<10;i++){
outfile<<i<<" "; //注意这行与上面的区别
}
outfile.flush();
outfile.close();
return 0;
}
这里需要说明一下原理:
当程序向输出设备中输出数据时,输出的数据先被存放在计算机缓冲区(Buffer)内。当缓冲区存满时,这些数据才真正地输出到输出设备。但是,如果输出的字符序列中出现了endl控制符,那么缓冲区内的所有数据将立即输出到输出设备,而无论缓冲区是否已经存满。因此,endl的作用将光标移动到输出设备中下一行开头处,并且清空缓冲区。
很有可能,出现在程序终止时,并没有输出所有的输出数据的情况。这是因为在程序终止时,缓冲区不一定是满的,所有也就没有将缓冲区的数据写到输出设备。
在C++中,可以使用flush函数来清空缓冲区,即使缓冲区中的数据不是满的。
2.将磁盘文件中的数据读到控制台
原理和写到文件类似,就是一个逆过程。
#include <iostream>
#include <fstream>
using namespace std;
int main(){
ifstream infile;
infile.open("D:\\data.txt");
string str;
infile >> str;
cout<<str<<endl;
infile.close();
return 0;
}