C++ 文件I/O流
C++文件的I/O流
一、c++对文本文件的读写
a.创建流对象,通过流对象打开文件
ofstream ofs(const char* filename,openmode mode);
b.通过成员函数方式,打开文件
void open(const char* filename);
void open(const char* filename,openmode mode);
filename :文件的路径
mode :打开方式
ios::app 添加输出
ios::ate 当已打开时寻找到EOF
ios::binary 以二进制模式打开文件
iOS::in 为读取打开文件
ios::out 为写入打开文件
ios::trunc 覆盖存在的文件
ifstream类,默认以只读方式O_RDONLY打开文件,文件不存在则失败"r"
ifstream类,默认以只写方式O_RDONLY|O_CREAT|O_TRUNC打开文件,文件不存在则创建、存在则清空"w"
fstream类,默认以读写方式O_RDWR打开文件,文件不存在则失败,文件存在不清空"r+"
注意:ios::里面打开模式单独使用和混合使用时候有些功能会有所删减变化,不是简单的功能相加,具体底层调用哪个打开模式可以通过strace ./a.out 来追踪底层对系统函数的调用
二、如何判断文件是否打开成功
a、通过!流对象名 执行了该类的!运算符重载版本
if(!ifs) //为真,则文件打开失败
b、通过good\fail成员函数判断是否打开成功
bool good();
功能:判断上一次流是否成功,成功返回真,一般用于判断文件是否打开成功
三、读写文件
流对象 << 写操作
流对象 >> 读操作
对类对象操作符<< >>进行重载
class Student
{
string name;
int age;
char sex;
float score;
public:
Student(const string& name,int age,char sex,float score):name(name),age(age),sex(sex),score(score){}
const string& getName(void) const
{
return name;
}
const int getAge(void) const
{
return age;
}
const char getSex(void) const
{
return sex;
}
const float getScore(void) const
{
return score;
}
friend ostream& operator<<(ostream& os,const Student& stu)
{
return os<<stu.getName()<<" "<<stu.getAge()<<" "<<stu.getSex()<<" "<<stu.getScore()<<endl;
}
friend istream& operator>>(istream& is,Student& stu)
{
return is>>stu.name>>stu.age>>stu.sex>>stu.score;
}
}
四、关闭文件
成员函数:
void close(void)
注意:只是关闭流对象当前的文件,但是流对象没有销毁,还可以继续通过open成员函数重新打开别的文件
如何以文本方式读写类对象?
读写类对象时绝大部分成员变量都是私有的,因此无法直接在类外进行读写
由于ostream/istream分别是ofstream/ifstream的父类,因此如果重载了>> <<运算符,既可以用于平时输出、输入类催下,并且还可以直接用于类对象的文本方式流操作读写
cout<<类对象
cin>>类对象 重载后
ofs<<类对象
cin>>类对象 成立
五、c++的随机读写
c++为文件IO提供了俩套设置位置指针的成员函数,为了兼容一些有俩个位置指针的操作系统,但是UNIX、Linux、Windows系统底层只有一个文件位置指针,所以使用哪一套都没有区别
istream& seekg(off_type offset,ios::seekdir origin);
功能:通过 偏移量+基础位置 设置位置指针的位置
offset:偏移量
origin:基础位置
ios::beg 文件开头
iOS::cur 当前位置
ios::end 文件末尾
istream& seekg(pos_type position);
功能:通过绝对值的方式设置位置指针的位置
seekp类似