笔记:C++程序产生的数据保存文件
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
- 一、C++文件读写
- 打开关闭文件
- 读写文件
- 检测EOF
- 读写文件状态标识符验证
- 文件指针定位
- 二、例子
一、C++文件读写
- fstream 可同时读写的文件类
- ofstream 写 *** 作(out输出)文件类
- ifstream 读文件(in输入)文件类
void open(const char* filename, openmode mode,int access);
- filename: 要打开的文件名。
- mode:文件打开方式,如下 :ios::in 输入 ios::out 输出 ios::ate初始位置文件尾 ios::app附加再文件末尾 ios::trunc文件存在则删除文件 ios::binary二进制文件
标识符可以组合,中间使用"|"间隔 - access:打开文件的属性取值:
0:普通文件。1:只读文件。2:隐藏文件。4系统文件
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()
该种方式还有一种简单的格式化能力,如下:
- dec 格式化为十进制数值数据 输入和输出
- endl 输出一个换行符并刷新此流 输出
- ends 输出一个空字符 输出
- hex 格式化为十六进制数值数据 输入和输出
- oct 格式化为八进制数值数据 输入和输出
- setpxecision(int p) 设置浮点数的精度位数 输出
例:
Filename << oct << 123456; //把123456当作八进制输出 Filename << setpxecision(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(unsigned char *buf, int num)
- write(const unisgned char*buf int num)
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
成员函数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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)