前言
- < ifstream> 读取文件的内容
- < ofstream> 用于创建文件并向文件中写入内容
- < fstream > 同时具有ofstream和ifstream两种功能
读写文件基础操作
写文件
//1包含头文件
#include<iostream>
#include<ofstream>
using namespace std;
int main()
{
//创建对象
ofstream ofs;
//以写入和追加到文件末尾方式打开文件
ofs.open("file.text",ios::out|ios::app);
//判断文件是否成功打开了
if (!ofs.is_open())
{
cout << "文件打开失败" << endl;
ofs.close();
exit(-1);
}
//写入文件
ofs << " 11111 15";
//关闭
ofs.close();
}
读文件
#include<iostream>
#include<ifstream>
using namespace std;
int main()
{
string file;
cout<<"请输入文件名"<<endl;
cin>>file;
ifstream ifs(file.c_str(),ios::in);//读操作
if (!ifs.is_open())
{
cerr << "文件打开失败" << endl;
ifs.close();
exit(-1);
}
char buffer[1024] = { 0 };
int n;//计数
//读取文件时,但读到文件末尾时,ifs>>buffer条件会为假
//碰到空格时,while循环会执行一次并将多到的数据存到buffer中。
while (ifs >> buffer)
{
n++;
cout << buffer << endl;
}
cout<<"循环执行"<<n<<"次"<<endl;
ifs.close();
}
- 注意:上面写文件的创建对象和打开文件可以像读文
件那样合并到一起,两者的效果等效。如:
ofstreamofs(“file.text”,ios::out|ios::app); - open()函数有两个重载,原型为:
void open( const char *filename );
void open( const char *filename, openmode mode );
注意:filename类型为c风格字符串,如果使用string请注意使用file.c_str()将其转为c风格。
openmode
-
ios::in 为读取打开文件
-
ios::out 为写入打开文件
-
ios::trunc 覆盖原来已经存在的文件(具有写属性)
当文件已经存在了,进行写文件时,将删除原来所有内容从新进行写数据。 注意,此项只能用于写文件中,用于读文件会导致文件打不开,或读出空数据。 -
ios::app 在文件末尾添加数据,不会覆盖原来的数据
-
ios::ate 当已打开时寻找到EOF(文件末尾)在写文件时,会清空原来的数据,在读文件时会定位到文件末尾,导致读出数据为空
-
ios::binary 以二进制模式打开文件
openmode的组合有许多,篇幅问题就不一一介绍了,感兴趣的小伙伴可以自己动手实践实践,可以加深自己的动手能力,毕竟自己动手总结的要远比别人总结后告诉你要更有成就感。
你也可以像示例那样可以使用|将多个openmode连接到一起使用。但要注意:有冲突的openmode一起使用会导致文件打开出错 如:ios::app|ios::trunc.
晋级操作
随机读文件
#include<iostream>
#include<ifstream>
using namespace std;
int main()
{
ifstream ifs("file.text", ios::in | ios::binary);//读操作
if (!ifs.is_open())
{
cerr << "文件打开3失败" << endl;
ifs.close();
exit(-1);
}
char buffer[1024] = { 0 };
//获取当前指针位置
streampos pos = ifs.tellg();
cout << pos << endl;
//定位到指定位置
ifs.seekg(3,ios::cur);
//将数据从指定位置读到buffer中,对应的写有write()
ifs.read(buffer, sizeof(buffer));
cout << buffer << endl;
ifs.close();
}
- 函数read()用于输入流,在将字符放入buffer 之前从流中读取num 个字节。如果碰到EOF,read()中止。第一个参数必须要转换为char*才可以。
- tellg()函数用于输入流,并返回流中"get"指针的当前位置。注意返回的类型为streampos。
- 函数seekg()用于输入流,并且它将重新设置"get"指针到当前流的从origin偏移offset个字节的位置上,或是置"get"指针在position位置。 它有两重载函数,依次对应上面两种情况
istream &seekg( off_type offset, ios::seekdir origin );
istream &seekg( pos_type position );
ios::seekdir有三种取值分别为:
- ios::cur 表示输入/输出流当前的位置。
ios::beg 表示输入/输出流开始的位置。
ios::end 表示输入/输出流结束的位置。
第一个参数是偏移量,整数表示向后偏移,负数表示向前偏移。
随机写文件
输入流操作:seekg()和tellg()。
输出流操作: seekp()和tellp()。
他们相互对应的,基本操作也都一样,唯一不同的是,一个用于输入流一个用于输出流。因此便不详细说明了,给大家留个例子仅供参考。
#include<iostream>
#include<ofstream>
using namespace std;
int mian()
{
//1包含头文件
//创建对象
ofstream ofs;
//打开方式
ofs.open("file.text", ios::out | ios::binary );
//判断文件是否成功打开了
if (!ofs.is_open())
{
cerr << "文件打开失败" << endl;
exit(-1);
}
//获取当前指针位置
streampos pos=ofs.tellp();
//从当前指针位置开始写
//ofs.seekp(pos);
//从开始位置往后移动三下的位置开始写数据,
//会清空原来的数据
ofs.seekp(3, ios::beg);
写入文件
ofs << " 11111 15";
//关闭
ofs.close();
}