笔记:C++程序产生的数据保存文件
void open(const char* filename, openmode mode,int access);
ios::in
输入 ios::out
输出 ios::ate
初始位置文件尾 ios::app
附加再文件末尾 ios::trunc
文件存在则删除文件 ios::binary
二进制文件is_open()
函数可以查看文件是否被打开
close()
函数,关闭文件。
例如:
fstream Filename;
Filename.open("test.txt", ios::out);
if(Filename.is_open()){}
Filename.close()
1、文本文件
使用插入器(<<)向文件输入;用解析器(>>)向文件输入。
例:
Filename.open("...",...);
string str;
Filename<< str; //向文件写一个字符串
char *buff;
Filename >> buff; //读取字符串到buff中
Filename.close()
该种方式还有一种简单的格式化能力,如下:
头文件例:
Filename << oct << 123456; //把123456当作八进制输出
Filename << setprecision(3) << 0.123456; //设置小数点为3为输出
2、二进制文件
①put()
函数,put()函数向流写入一个字符。
例:
Filename.put('x');//向文件流中写入字符x,若文件中有数据,会替换数据
②get()
函数。有3种常用重载形式。
第一种:与put函数对应。
Filename.get(x);//从文件流中获取一个字符,保存在x中。
第二种:从文件流中返回一个字符,到文件末尾返回EOF
char x = Filename.get(); 返回一个字符
第三种:ifstream &get(char *buf, int num, delim='n')
把字符读入由buf指向的数组,读num个字符或遇到了delim指定的字符停止。例:
Filename.get(buf, 3, "a"); //读三个字符到buf中,遇到a停止。
③读写数据块:
读写数据块要用到read()
函数和write()
函数。函数声明如下:
read()
从文件中读取 num 个字符到 buf 指向的缓存中,如果在还未读入 num 个字符时就到了文件尾,可以用成员函数 int gcount()来取得实际读取的字符数;而 write()
从buf 指向的缓存写 num 个字符到文件中,值得注意的是缓存的类型是 unsigned char *,有时可能需要类型转换。
例:
Filename.read(buff, 5); //从文件中读取5个字符到buff中
int a = Filename.read(buff, 5).gcount();//使用read成员函数gcount查看读取字符数
const char *buff = "i love you";
Filename.write(buff, 5); //从buff中写5个字符到文件中
成员函数eof()
检测是否到达文件末尾。到达返回非0值,未到达返回0。例:
int a = Filename.eof();//可以查看a的值看是否到达文件末尾。
bad()
函数,读写过程中出错返回true。
fail()
函数,与bad() 同样的情况下会返回 true ,格式错误时也返回true
good()
函数,如果调用以上任何一个函数返回true 的话,此函数返回 false
要想重置以上成员函数所检查的状态标志,你可以使用成员函数clear()
,没有参数
tellg()
和tellp()
这两个成员函数不用传入参数,返回pos_type 类型的值,就是一个整数,代表当前get 流指针的位置 (用tellg) 或 put 流指针的位置(用tellp)。
int a = Filename.tellg();
int a = Filename.tellp();
seekg()
和seekp()
C++的文件定位分为读位置和写位置的定位,对应的成员函数是 seekg()和 seekp(),seekg()是设置读位置,seekp是设置写位置。它们最通用的形式如下:
istream &seekp(streamoff offset, seek_dir origin); //seekp声明
istream &seekg(streamoff offset, seek_dir origin); //seekg声明
offset表示偏移量,origin表示移动的基准位置。
origin参数有:ios::beg
文件开头。 ios::cur
文件当前位置。 ios::end
文件结尾。 [注]这两个函数一般用于二进制文件。
Filename.seekp(5, ios::cur); //当前写位置向后移动5个字符
Filename.seekp(-5, ios::cur); //当前写位置向前移动5个字符
Filename.seekg(5, ios::cur); //当前读位置向后移动5个字符
Filename.seekg(-5, ios::cur); //当前读位置向前移动5个字符
在当前工作目录下建文件夹"test,txt"。
#include
#include
using namespace std;
const *buff = "I love you";
char buf[10];
char x;
int main()
{
fstream Filename;
Filename.open("test.txt", ios::in|ios::out|ios::binary);
Filename << "I love you "; //写一个字符串到Filename文件
Filename >> buf; //读一个字符到buf指向的缓存中。
Filename.put("x");//写一个字符到文件中
Filename.get(x);//读一个字符到x中
Filename.read(buf, 5);//从文件中读取5个字符到buf中
Filename.write(buff, 5);//从buff中写5个字符到文件中
Filename.close();
return 0;
}
参考1
参考2
参考3