本次将为大家介绍c++文件读写操作这个主题。为了方便大家对比查看,一些说明将写在代码注释中。下面的代码演示了文件的写入和读取操作,并介绍了getline的一个简单用法。
#include <iostream> #include <fstream> #include <string> using namespace std; int main() { string str; // 读写文件三步: // 1、创建读写对象即流; // 2、将对象即流与文件绑定; // 3、通过对象即流对文件进行读写操作 ofstream fout;//创建流对象 fout.open("1.txt");//与流对象绑定,文件若存在则用输入内容将原来内容覆盖,若无则创建。 //ofstream fout("1.txt")//使用流对象的默认构造函数,实现1、2步的功能 while(cin>>str && str != "q")//进行输入,输入为q时结束输入 fout<<str<<";";//通过流对文件进行写操作。每个输入后加个";",后面介绍个getline功能 /* 当流对象过期或程序终止时,流会自动关闭。当然,也可以主动调用close函数,断开流与文件的连接。 注意只是一端!!!程序与流那端的连接还在,包括程序对流的设置。 */ fout.close();//断开流与文件的连接。 fout.clear();//重置流状态 ifstream fin("1.txt"); int count = 0;//统计输入字符个数,其实是遇到";"加1 //getline(fin,str,';');//将第三个默认参数"\n"改为";",由读取整行变为遇到";"读取到str while (getline(fin,str,';'))//未到文件尾 { count++; cout<<count<<":"<<str<<endl; } cout<<"The total number of words is "<<count<<endl; return 0; }
输入利用cin有包括但不限于遇到空格就读取输入缓冲区中内容的特性,将输入简洁化。程序的输出结果如下:
下面就程序进行几点说明:
1、每个流对象只可以在同一时刻关联一个文件:也就是说如果要同时打开两个文件,就必须为每个文件创建一个流对象;也可以将一个流对象关闭与文件的连接之后关联到另一个文件中。
2、close将流与文件之间的关联连接关闭后,有的编译器有时需要调用clear重置流状态,以便程序可以再次访问该文件。
while(fin.get(ch))count++; fin.close(); fin.clear(); fin.open("1.txt");如上述代码,若未使用clear重置流状态,则新的fin对象的输入缓冲区中将不会有内容。
3、getline第三个参数默认是‘/n’,也就是说遇到换行时将之前的内容读入,即读取整行内容。例子中将其改为‘;’,遇到‘;’进行读取。利用此特点统计出了输入字符的个数,重点并不是想要统计输入个数,只是给大家介绍getline的这种用法。在输出中并没有‘;’出现,也就是说它将‘;’从缓冲区中丢弃了。同理,在使用getline进行整行读取时,也会丢弃缓冲区中的换行符。顺便说下,get函数则不会,换行符仍将保留在输入缓冲区中。希望通过这个例子,加深大家对二者区别的理解。值得注意的是,通过此次设置,getline将会把换行符当成普通字符处理,也就是说文件中若有换行,则会直接输出,不会区别对待。大家可以人为的在文件中加个换行符,看下输出效果。
本人才疏学浅,其中若有错误,欢迎指正,不胜感激。
TO BE CONTINUED!