参考博文:http://www.cnblogs.com/likebeta/archive/2012/06/16/2551662.html
1.申明文件流与打开关闭文件:
c++中,文件被抽象为一个流,有相应的文件流类与之对应。包含头文件<fstream>,以下声明一个文件流:
ifstream file; //文件打开用于从文件输入到内存
ofstream file; //文件打开用于从内存输出到文件
fstream file; //文件打开可用于输入和输出
ifstream/ofstream/fstreafile(“filename”,mode); //使用构造函数关联文件
mode指以什么方式打开文件:可以用“|”符号链接组合多个mode。
os::in 为输入(读)而打开文件
ios::out 为输出(写)而打开文件
ios::ate 初始位置:文件尾
ios::app 所有输出附加在文件末尾
ios::trunc 如果文件已存在则先删除该文件
ios::binary 二进制方式
使用成员函数关联文件:
file.open(“filename”,mode);
关闭文件:
file.close();
2、成员函数
2.1、文件状态函数
file.is_open(); //判断文件打开状态,成功打开返回TRUE,否则返回FALSE
file.eof(); //判断文件是否到达文件末尾,到达返回TRUE,否则返回FALSE
file.bad(); //在读写过程中出错,返回TRUE,否则默认为FALSE
file.fail(); //读写过程中出错,或者格式错误是返回TRUE,否则默认为FALSE
file.good(); //以上函数返回TRUE时,此函数返回FALSE
file.clear(); //重置上述函数的参数为默认值
2.2、文件流位置函数
file.tellg();
//返回pos_type类型的值(根据ANSI-C++标准),是一个整数,代表当前get流指针的位置(指向下一个将被读取的元素)文件打开时(非ios::ate方式)该指针指向文件开头,即0。
file.tellp();
//返回put流指针的位置(指向写入下一个元素的位置),注意,如果文件不是以ios::ate方式打开,该指针在文件打开时是指向文件开头的,也就是说,在写入时,会覆盖之前的文件内容。
设置get文件流指针(从文件获取内容到内存的指针),重载函数:
file.seekg(pos_type position);
//设置get流指针的位置,参数即表示第几个字符的下标
fiel.seekg(off_typeoffset,seekdir direction);
//参数一为偏移量,可正可负,参数二为偏移基址,可取的值有三个:
* ios::beg 输入流的开始
* ios::cur 输入流的当前位置
* ios::end 输入流的结束
设置put文件流指针(从内存输入文件的指针),重载函数:
file.seekp(pos_typeposition);
file.seekp(off_type,seekdirdirection);
2.3获取文件内容
文件以ios::in打开时,可以获取文件内容:
file.getline(buffer,size);//从文件中读取一行字符到buffer指向的缓存中
file.read(uchar *buffer, int size);//从文件中读取size个字符到buffer中
int x; file>>x;//从文件中输入一个int值到x中(其实cin也是一个输入流文件,它指键盘)
file.get();//从文件流当前位置获取一个字符并返回(默认为int,可以显式转换为char)
file.get(x);//从文件中读取一个字符保存到x中
file.get(char *buf,int num ,char delim=’n’);// 这种形式把字符读入由buf 指向的数组,直到读入了 num 个字符或遇到了由 delim 指定的字符,如果没使用 delim 这个参数,将使用缺省值换行符'n'。例如:
file2.get(str1,127,'A');//从文件中读取字符到字符串str1,当遇到字符'A'或读取了127个字符时终止。
2.4输出到文件
文件以ios::out打开时
file<<”xxxxx”<<endl;//将字符串“xxxxx”输出到文件中
file.put(‘a’);//向文件流当前位置写入一个字符’a’
file.write(uchar *buffer,int counter); //从buffer指向的缓存中写num个字符到文件中,
注意:buffer的类型为unsigned char*,而我们一般都会申明char *的变量,所以有时候可能需要类型转换。
2.5缓存与同步
对文件流操作时,操作的内容会与一个streambuf类型的buffer(一块内存)联系在一起,当要输出到文件时,先从键盘输入到buffer,当要使用文件中的数据时,先从文件输出到buffer中,当出现以下几种情况时,才会将buffer同步(写入到物理文件或简单地清除):
1. 文件关闭
2. 显式地使用flush()函数或endl(其实endl内部也调用了flush函数)
3. 调用sync()函数
2.6插入器和析取器
<<:插入器,向流输出数据。比如说系统有一个默认的标准输出流(cout),一般情况下就是指的显示器,所以,cout<<"Write Stdout"<<'n';就表示把字符串"WriteStdout"和换行字符('n')输出到标准输出流。
>>:析取器 ,从流中输入数据。比如说系统有一个默认的标准输入流(cin),一般情况下就是指的键盘,所以,cin>>x;就表示从标准输入流中读取一个指定类型(即变量x的类型)的数据。