C++学习笔记(六)——文件操作

来源:互联网 发布:淘宝买家秀福利店铺名 编辑:程序博客网 时间:2024/06/08 05:53

参考博文: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的类型)的数据。

1 0
原创粉丝点击