Ofstream是从内存到硬盘,ifstream是从硬盘到内存。其实所谓的流缓冲就是内存空间。
在C中,有一个流类。所有的I/O都是基于这个“流”类,包括我们想知道的文件I/O。stream类有两个重要的操作符:
1.插入器()
将数据输出到流。例如,系统有一个默认的标准输出流(cout),它通常指的是显示器,因此cout 'Write Stdout ' ' \ n这意味着将字符串' Write Stdout '和换行符(' \n ')输出到标准输出流。
2、析取器()
输入流中的数据。比如系统有默认的标准输入流(cin),一般指键盘,所以cinx它意味着从标准输入流中读取指定类型(即变量x的类型)的数据。
在C中,文件的操作是通过stream的子类fstream(文件流)来实现的。因此,要以这种方式操作文件,必须添加头文件fstream.h。下面我们就把这种文件操作流程一个一个来说。
一、打开文件 在fstream类中,有一个成员函数open(),用来打开文件。它的原型是:
void open(const char* filename,int mode,int access);参数:
Filename:要打开的文件名。
模式:打开文件的方式。
访问:打开文件的属性。
打开文件的方式是在ios类中定义的(它是所有流I/O类的基类)。常见的值如下:
Ios:app:以追加方式打开文件。
Ios:ate:打开后在文件末尾定位文件,ios:app中包含该属性。
Ios:binary:以二进制模式打开文件,默认模式是文本模式。两种方式的区别见上。
Ios:in:通过输入打开文件(文件数据被输入到内存中)
Ios:out:文件作为输出打开(内存数据输出到文件)
Ios:nocreate:没有创建文件,因此当文件不存在时,打开会失败。
Ios:noreplace:不覆盖文件,所以打开文件时如果文件存在就失败。
Ios:trunc:如果文件存在,将文件长度设置为0。
可以用OR连接以上属性,比如ios:out|ios:binary。
打开文件的属性值为:
0:普通文件,开放访问
1:只读文件
2.隐藏文件
4.系统文件
可以用or或OR连接以上属性,例如3或1|2是用只读和隐式属性打开文件。
例如,用二进制输入打开文件c:\config.sys。
fstream文件1;
file1.open('c:\\config.sys ',ios:binary|ios:in,0);
如果open函数只有一个参数,即文件名,它将作为读/写普通文件打开,即:
file 1 . open(' c:\ \ config . sys ');=file1.open('c:\\config.sys ',ios:in|ios:out,0);
此外,fstream与open()具有相同的构造函数。对于上面的示例,文件可以在定义时打开:
fstream file 1(“c:\ \ config . sys”);特别地,fstream有两个子类:ifstream(输入文件流)和ofstream(输出文件流)。ifstream默认通过输入打开文件,ofstream默认通过输出打开文件。
ifstream file 2(' c:\ \ pdos . def ');//打开文件作为输入。
of stream file 3(' c:\ \ x . 123 ');//在输出模式下打开文件。所以,在实际应用中,根据不同的需求选择不同的类来定义:如果要在输入模式下打开文件,使用ifstream来定义;如果你想把它作为一个输出打开,使用ofstream来定义它;如果你想在输入/输出模式下打开它,使用fstream来定义它。
其次,关闭文件
打开的文件使用后必须关闭,fstream提供了一个成员函数close()来完成这个操作,比如file 1 . close();关闭连接到文件1的文件。
三。阅读和编写文档
读写文件可以分为读取文本文件和读取二进制文件。阅读文本文件相对简单,只需使用插入器和提取器。对于二进制读取,就比较复杂了。下面将详细介绍两种方法。
1、文本文件的读写 文本文件的读写很简单:使用inserter()输出到文件;使用extractor()从文件中输入。假设文件1作为输入打开,文件2作为输出打开。例子如下:
文件2“我爱你”;//将字符串“我爱你”写入文件
int I;
file1i//从文件中输入一个整数值。
该方法还具有简单的格式化能力,例如将输出指定为十六进制等。具体格式如下
操作员功能输入/输出
Dec格式的十进制数字数据输入和输出
Endl输出一个新行并刷新流输出。
输出一个空字符输出。
十六进制被格式化为十六进制数字数据输入和输出
Oct被格式化为八进制数字数据输入和输出。
Setpxecision(int p)设置浮点数的精度数字输出。
例如,将123作为十六进制输出:file1。
2、二进制文件的读写 put()
put()函数向流中写入一个字符,其原型是ofstream put(char ch),使用起来也比较简单,比如file 1 . put(' c ');就是在流中写一个字符c。
获取()
get()函数很灵活,有三种常用的重载形式:
一种是put()对应的形式:ifstream get(char ch);函数是从流中读取一个字符,结果保存在引用ch中。如果到达文件的末尾,它将返回一个空字符。例如file 2 . get(x);它意味着从文件中读取一个字符,并将读取的字符保存在x中。
另一个重载的原型是:int get();这个形式是从流中返回一个字符,如果到达文件末尾,返回EOF,比如x=file 2 . get();该函数与前面的示例相同。
还有一个原型:ifstreamget (char * buf,intnum,char delim=' \ n ');在这种形式中,字符被读入buf指向的数组,直到num个字符被读取或遇到delim指定的字符。如果不使用参数delim,将使用默认换行符' \n '。例如:
file2.get(str1,127,' A ');//将文件中的字符读取到字符串str1中,当遇到字符“a”或读取到127个字符时终止。
读写数据块。
要读写二进制数据块,请使用成员函数read()和write(),其原型如下:
read(无符号char *buf,int num);
write(const unsigned char *buf,int num);
Read()从文件中读取num个字符到buf指向的缓存中。如果在读取num个字符之前到达文件末尾,可以使用成员函数int gcount();获取实际读取的字符数;write()将buf指向的缓存中的num个字符写入文件。值得注意的是,缓存的类型是无符号char *,有时可能需要进行类型转换。
示例:
无符号char str1[]='我爱你';
int n[5];
if stream in(' XXX . XXX ');
of stream out(' yyy . yyy ');
out.write(str1,strlen(str 1));//将所有字符串str1写入yyy.yyy
in.read((无符号char*)n,sizeof(n));//从xxx.xxx中读取指定的整数,注意类型转换。
in . close();out . close();4.EOF检测
eof()成员用于检测是否到达了文件的末尾。如果到达文件末尾,它将返回一个非零值;否则,它将返回0。是原型int eof();
示例:if(in.eof()) ShowMessage('已到达文件结尾!');
动词(verb的缩写)文档定位
与C的文件操作模式不同,C I/O系统管理与一个文件相关联的两个指针。一个是读指针,指示输入操作在文件中的位置;另一个是写指针,是下一次写操作的位置。每次执行输入或输出时,相应的指针会自动改变。所以C的文件位置可以分为读位置和写位置,对应的成员函数是seekg()和seekp()。Seekg()是设置的读取位置,seekp是设置的写入位置。它们最常见的形式如下:
istream seekg(streamoff偏移量,seek_dir原点);
ostream seekp(streamoff偏移量,seek_dir原点);
Off stream在iostream.h中定义,定义了offset可以获得的最大值,seek_dir表示移动的参考位置,是一个枚举,有以下值:
Ios:beg:文件开头
Ios:cur:文件的当前位置
Ios:end:文件结尾
这两个函数通常用于二进制文件,因为文本文件可能会因为系统对字符的解释而与预期值不同。示例:
file1.seekg(1234,IOs:cur);//将文件的读取指针从当前位置向后移动1234个字节
file2.seekp(1234,IOs:beg);//将文件的写指针从文件的开头向后移动1234个字节
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。