C/C++中的文件操作(2)
C++文件操作。
C++中引入了stream,相关的头文件<fstream>,支持文件输入与输出,还有两个<ifstream>和<ofstream>,分别支持文件读入和写入。
文件的打开与关闭
fstream作为一种对象,它的操作由构造函数,成员函数来完成。
fstream ( ); explicit fstream ( const char * filename, ios_base :openmode mode = ios_base::in | ios_base::out );
fstream f("input.txt",fstream::in|fstream::out);
构造函数,在构造的时候可以直接指定要打开的文件名,指定打开模式,input或者output,或者同时input和output,也可以append或者binary模式,可以使用|进行组合。在不指定打开模式的时候,采用默认值,in|out同时可用。
如果不在构造的时候打开文件,可以使用open成员函数来打开文件,open的参数与构造函数的参数类似。但是它没有返回值。
void open ( const char * filename, ios_base :openmode mode = ios_base::in | ios_base::out );
fstream f;
f.open("input.txt",fstream::in|fstream::out)
如果要判断文件是否打开成功,需要使用is_open来判断是否处于打开状态。
成员函数close则用来关闭文件。
内容的读取与写入
C++引入了流操作,流操作符>>和<<用来从文件读取内容或把内容写入文件。
istream& operator>> (type &val);与fscanf对应,格式化的读取内容,格式由值的type确定。
读取字符串的时候,会读到空格或者换行结束。
也有其它格式控制的函数,如hex以十六进制读取,dec以十进制读取,skipws跳过空白,等。
成员函数get,可以读取单个字符,也可以读取字符串,并指定读取的长度,终止符号(一般是'\n'),也可以读到stream里面。
成员函数getline,读取一行内容到字符串,指定字符串长度(包括字符串终止符号'\0'),也可以指定终止符号。
成员函数ignore(streamsize n=1,int delim=EOF),忽略n个字符,或者到delim结束。
还有read和readsome也可以读取输入。
ostream& operator<< (type val);流输出,一直觉得C++的输出格式控制没有C的printf方便,也就一直没有好好看看C++是怎么控制输出个好似的。这次还是好好看看吧。
hex/dec/oct 按16/10/8进制输出
[no]showbase,(不)显示基数前缀,
[no]showpoint,(不)显示小数点,
[no]showpos,(不)显示正号
fixed,定点输出
scientific,科学记数法
left/internal/right,左/右对齐
flush,立即输出
[no]unitbuf,(不)单元输出,
[no]uppercase,全大写输出,
setw,设置宽度
也可以通过成员函数setf来设置输出格式。
输出也可以用put,write等成员函数,<<应该就够用了,暂时就不看了。
put,输出单个字符,
write(char* buf,int size),写数据块。
关于指针在文件中的位置,还是看看吧。
streampos tellp()得到当前位置,
seekp(streampos pos),设置当前位置,设置到文件头,pos=0,
seekp(streamoffset offset,ios_base::seek_dir),以相对位置设置当前位置,参考可以是ios_base::beg/cur/end。
在C中,ftell/fseek/fsetpos/rewind也是跟指针在文件中的位置相关的函数。
文件输入输出重定向
与C中重定向不同,C++中文件是stream对象,不可以直接赋值给stdin,也没有reopen函数,而是cin或者cout使用的rdbuf()成员函数。如果文件重定向结束,需要将cin还原为stdin,那么可以在重定向之前,备份cin的rdbuf,参考http://www.cnblogs.com/shilcare/archive/2010/09/02/1816062.html。
示例代码如下:
#include <iostream> #include <string> #include <fstream> using namespace std; int main() { fstream fin("input.txt",fstream::in); fstream fout("output.txt",fstream::out);
streambuf *backup; // backup the cin streambuf
backup = cin.rdbuf(); cin.rdbuf(fin.rdbuf()); // input from fin cout.rdbuf(fout.rdbuf()); // output to fout char buf[256]; while(cin) { cin.getline(buf,256); // read a line from input.txt string line = buf; cout << line << endl; // output the line to output.txt }
cin.rdbuf(backup); return 0; }
至此,文件操作基本结束。