打开文件的方式
void open(const char* fname, int mode);
其中mode取值如下:
ios::in 打开文件进行读操作,若文件不存在,则打开文件失败
ios::out 打开文件进行写操作,打开文件时会清空原有内容;若文件不存在,则自动建立新文件
ios::app 打开文件进行写操作,打开文件时不会清空数据,文件指针始终指向文件文件末尾,因此只能在文件尾写数据。若文件不存在,则自动建立新文件
ios::binary 打开文件为二进制文件,否则为文本文件
ios::trunc 若打开文件已存在,则清空文件的内容
ios::ate 打开文件时文件指针指向文件末尾,但可以在文件中的任何地方写数据
注:
1.ofstream类将ios::out作为默认模式;ifstream类将ios::in作为默认模式;fstream类没有设置默认模式,必须在创建fstream类对象时指定,如果不指定则根据后面的操作确定模式
2.可用位操作符OR(|)同时设置几个标志位
3.同时设置trunc和app,或者设置了trunc却没有设置out,都会导致打开文件失败istream& read(char* s, streamsize n):从流中读取n个字符放到s指向的数组中,读取过程中不会检查数据(意味着读取到空格或者
换行符不会停止读取),也不会自动添加一个null作为字符串结束符,如果碰到EOF则函数结束,并置eofbit和failbit为1;如果流中
的字符数目超出了指定数目,则剩下的字符依然保存在流中
ostream& write(const char* s, streamsize n):从s指向数组中取出n个字符放到流中,提取过程中不会检查数据(意味着即使读取
的是null也不会停止提取)
steamsize gcount() const:返回上一次非格式化提取运算符所读取的字符数,即返回的是get()、getline()、ignore()或者read()
函数所读取的字符数,而不能用于提取operator>>()函数所提取的字符数
注:对于get()函数,读取的是n-1个字符;对于getline()函数,如果第n个字符不是结束符delim,则读取的是n-1个字符;如果第n个
字符是结束符delim,则读取的是n个字符,且读取结束符后会将其抛弃,这同前面将的get()和getline()函数是一样的
int peek():返回输入流的下一个字符,如果处于文件末尾,则返回EOF
注:该函数只是查看输入流中的数据,并不会真正的提取数据并写在标准输出设备上
istream& putback(char c):将一个字符从输入流中丢弃,并用字符ch代替插入到输入流中假如我们指向读取文件指定位置之后数据,那么fstream类的seekg()成员函数可以为我们达到目的。
seekg()函数原型如下:
istream& seekg( streampos pos );
istream& seekg( streamoff off, ios::seek_dir dir );
该函数从istream类继承而来,它被重载了两次,第1个原型将指针定位到离文件开头pos个字节处;第2个原型则将指针定位到距第2个参数
指定的位置off个字节处。假如我们想要在文件指定位置处输出数据,那么fstream类的seekp()成员函数可以为我们达到目的。
seekp()函数原型如下:
ostream& seekp( streampos pos );
ostream& seekp( streamoff off, ios::seek_dir dir );
一般来说,第2个参数有下列几种可能的值:
ios::beg //相对于文件开头的偏移量
ios::cur //相对于当前位置的偏移量
ios::end //相对于文件结尾的偏移量
streampos tellg():返回输入流中当前指针的位置
streampos tellp():返回输出流中当前指针的位置
文件状态位
goodbit 无错误 good()
eofbit 已到达文件末尾 eof()
failbit 非致命的I/O错误 fail()
badbit 致命的I/O错误 bad()在VS中可看到文件状态位的定义如下:
static const _Iostate goodbit = (_Iostate)0x0; static const _Iostate eofbit = (_Iostate)0x1; static const _Iostate failbit = (_Iostate)0x2; static const _Iostate badbit = (_Iostate)0x4;关于文件状态位的几个函数:
iostate rdstate() const:返回流的当前状态位,比如if(input.rdstate() & std::ios::failbit)即通过与运算来判断当前的流状态是否为failbit
void clear(iostate state = goodbit):重置状态位为state,即先将所有状态位清零,再将状态位设置为state。默认重置状态位为goodbit,即将所有标志位清零;
你也可以传递参数,如clear(failbit)则重置状态位为failbit。我们一般使用默认值。
void setstate(iostate state):设置状态位,做法是不清零当前的状态位,而只是将参数对应的状态位置位,即设置状态位为rdstate()|state,即: void ios::setstate (iostate state) { clear(rdstate()|state); }注:
1.对于fstream对象来说,seekp()/seekg()等价,因为读写指针是同一个指针,而且tellg()/tellp()也等价,因为读写指针在同一个位置。
而对于ifstream/ofstream就需要使用特定函数。#include <iostream> #include <fstream> using namespace std; const int num = 20; struct people { char name[num]; float weight; float height; int age; char sex; }; int main() { people p = {"Kevin", 58.5, 179, 23, 'f'}; people p1 = {"Gary", 49.4, 170, 22, 'm'}; fstream fp("people.txt", ios::out | ios::binary); fp.write((char*)&p, sizeof(p)); fp.write((char*)&p1, sizeof(p1)); fp.close(); people temp; fp.open("people.txt", ios::in | ios::binary); while(fp.read((char*)&temp, sizeof(temp))) cout<<temp.name<<" "<<temp.age<<" "<<temp.sex<<" "<<temp.height<<" "<<temp.weight<<endl; fp.close(); system("pause"); return 0; }