C++通过以下几个类支持文件的输入输出
(1) ofstream:写操作,输出文件类;
(2) ifstream:读操作,输入文件类;
(3) fstream:可同时读写的文件类。
1. open函数:打开文件
函数原型:void open(const char*filename,int mode,int access);
参数说明:filename: 要打开的文件名 mode: 要打开文件的方式 access: 打开文件的属性
打开文件的方式在类iOS(是所有流式I/O类的基类)中定义,常用的值如下: ios::app: 以追加的方式打开文件 ios::ate: 文件打开后定位到文件尾,ios:app就包含有此属性 ios::binary: 以二进制方式打开文件,缺省的方式是文本方式。两种方式的区别见前文 ios::in: 文件以输入方式打开 ios::out: 文件以输出方式打开 ios::nocreate: 不建立文件,所以文件不存在时打开失败 ios::noreplace:不覆盖文件,所以打开文件时如果文件存在失败 ios::trunc: 如果文件存在,把文件长度设为0 可以用“或”把以上属性连接起来,如ios::out|ios::binary 打开文件的属性取值是: 0:普通文件,打开访问 1:只读文件 2:隐含文件 4:系统文件 例如:以二进制输入方式打开文件c:\config.sys fstreamfile1; file1.open("c:\\config.sys",ios::binary|ios::in,0);
ofstream file; file.open ("example.bin", ios::out |ios::app | ios::binary);
2. close函数
函数原型:void close()
3. 二进制文件(Binary files)
在二进制文件中,使用<< 和>>,以及函数(如getline)来操作符输入和输出数据,没有什么实际意义,虽然它们是符合语法的。
文件流包括两个为顺序读写数据特殊设计的成员函数:write 和 read。第一个函数 (write) 是ostream 的一个成员函数,都是被ofstream所继承。而read 是istream 的一个成员函数,被ifstream 所继承。类 fstream 的对象同时拥有这两个函数。它们的原型是:
write ( char *buffer, streamsize size ); read ( char * buffer, streamsize size );
这里 buffer 是一块内存的地址,用来存储或读出数据。参数size 是一个整数值,表示要从缓存(buffer)中读出或写入的字符数。
头文件: #include<cstdio>
函数声明: FILE * fopen(const char * path,const char * mode);
参数:
使用方式 具体含义 “rt” 只读打开一个文本文件,只允许读数据 “wt” 只写打开或建立一个文本文件,只允许写数据 “at” 追加打开一个文本文件,并在文件末尾写数据 “rb” 只读打开一个二进制文件,只允许读数据 “wb” 只写打开或建立一个二进制文件,只允许写数据 “ab” 追加打开一个二进制文件,并在文件末尾写数据 “rt+” 读写打开一个文本文件,允许读和写 “wt+” 读写打开或建立一个文本文件,允许读写 “at+” 读写打开一个文本文件,允许读,或在文件末追加数据 “rb+” 读写打开一个二进制文件,允许读和写 “wb+” 读写打开或建立一个二进制文件,允许读和写 “ab+” 读写打开一个二进制文件,允许读,或在文件末追加数据
文件使用方式由r,w,a,t,b,+六个字符拼成,各字符的含义是:
说明:
返回值: 文件顺利打开后,指向该流的文件指针就会被返回.若果文件打开失败则返回 NULL , 并把错误代码存在 errno 中.(附加说明 一般而言,开文件后会作一些文件读取或写入的动作,若开文件失败,接下来的读写动作也无法顺利进行,所以在 fopen() 后请作错误判断及处理.)
头文件: #include<cstdio>
函数声明: int fclose(FILE * stream);
说明: fclose() 用来关闭先前 fopen() 打开的文件.此动作会让缓冲区内的数据写入文件中,并释放系统所提供的文件资源.
返回值:
[fgetc][fputc][fgets][fputs][fread][fwrite][fprintf 与 fscanf][getc][getchar][gets][putc][putchar][puts][ungetc]
对文件的读和写是最常用的文件操作.在C语言中提供了多种文件读写的函数:(使用以下函数都要求包含头文件cstdio.)
头文件: include<cstdio>
函数声明: int fgetc(FILE * stream);
说明:
例子解析:
int ch; ch=fgetc(fp); 其意义是从打开的文件fp中读取一个字符并送入 ch 中. 对于fgetc函数的使用有以下几点说明:
应注意文件指针和文件内部的位置指针不是一回事.
返回值 : getc() 会返回读取到的字符,若返回 EOF 则表示到了文件尾
头文件: #include<cstdio>
函数声明: int fputc(int c,FILE * stream);
说明:
返回值: fputc() 会返回写入成功的字符,即参数 c.若返回 EOF 则代表写入失败.
头文件: #include<cstdio>
函数声明: char * fgets(char * s,int size,FILE * stream);
说明: fgets() 用来从参数 stream 所指的文件内读入字符并存到参数 s 所指的内存空间,直到出现换行字符、读到文件尾或是已读了size-1个字符为止,最后会加上 NULL 作为字符串结束.
返回值: gets() 若成功则返回 s 指针,返回 NULL 则表示有错误发生.
头文件: #include<cstdio>
函数声明: int fputs(const char * s,FILE * stream);
说明: fputs() 用来将参数 s 所指的字符串写入到参数 stream 所指的文件内.
返回值: 若成功则返回写出的字符个数,返回 EOF 则表示有错误发生.
头文件: #include<cstdio>
函数声明: size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream);
说明: fread() 用来从文件流中读取数据
参数:
返回值: 返回实际读取到的nmemb数目.
头文件: #include<cstdio>
函数声明: size_t fwrite(const void * ptr,size_t size,size_t nmemb,FILE * stream);
说明:
参数:
返回值: 返回实际写入的 nmemb 数目.
函数声明:
说明: 它们与 printf 和 scanf 函数相仿,都是格式化读写函数.不同的是:fprintf 和 fscanf 函数的读写对象不是终端(标准输入输出),而是磁盘文件.printf 函数是将内容输出到终端(屏幕),因此,fprintf 就是将内容输出到磁盘文件了
头文件: #include<cstdio>
函数声明: int getc(FILE * stream);
说明:
返回值: getc() 会返回读取到的字符,若返回 EOF 则表示到了文件尾.
头文件: #include<cstdio>
函数声明: int getchar(void);
说明:
返回值: getchar()会返回读取到的字符,若返回EOF则表示有错误发生.
头文件: #include<cstdio>
函数声明: char * gets(char *s);
说明: gets() 用来从标准设备读入字符并存到参数 s 所指的内存空间,直到出现换行字符或读到文件尾为止,最后加上 NULL 作为字符串结束,由于 gets() 无法知道字符串 s 的大小,必须遇到换行字符或文件尾才会结束输入,因此容易造成缓冲溢出的安全性问题.建议使用 fgets() 取代
返回值: gets() 若成功则返回 s 指针,返回 NULL 则表示有错误发生.
头文件: #include<cstdio>
函数声明: int putc(int c,FILE * stream);
说明:
返回值: putc() 会返回写入成功的字符,即参数 c.若返回 EOF 则代表写入失败.
头文件: #include<cstdio>
函数声明: int putchar (int c);
说明:
返回值: putchar() 会返回输出成功的字符,即参数 c.若返回 EOF 则代表输出失败.
头文件: #include<cstdio>
函数声明: int puts(char *s);
说明: 把函数的字符串写到标准输出流 stdout,在输出流中用换行符('\n')替换字符串中的结束符null 字符('\0 ')
返回值: puts() 若成功则返回正的非零值,返回 EOF 则表示有错误发生.
头文件: #include<cstdio>
函数声明: int ungetc(int c,FILE * stream);
说明: ungetc() 将参数 c 字符写回参数 stream 所指定的文件流.这个写回的字符会由下一个读取文件流的函数取得.
返回值: 成功则返回 c 字符,若有错误则返回 EOF.
[fflush] [setbuf] [setbuffer] [setlinebuf] [setvbuf]
头文件: #include<cstdio>
函数声明: int fflush(FILE* stream);
说明: fflush() 会强迫将缓冲区内的数据写回参数 stream 指定的文件中.如果参数 stream 为 NULL ,fflush() 会将所有打开的文件数据更新.
返回值: 成功返回 0 ,失败返回 EOF ,错误代码存于errno中.(错误代码: EBADF 参数 stream 指定的文件未被打开,或打开状态为只读)
头文件: #include<cstdio>
函数声明: void setbuf(FILE * stream,char * buf);
说明: 在打开文件流后,读取内容之前,调用 setbuf() 可以用来设置文件流的缓冲区
参数:
头文件: #include<cstdio>
函数声明: void setbuffer(FILE * stream,char * buf,size_t size);
说明: 在打开文件流后,读取内容之前,调用 setbuffer() 可用来设置文件流的缓冲区.
参数:
头文件: #include<cstdio>
函数声明: void setlinebuf(FILE * stream);
说明: setlinebuf() 用来设置文件流以换行为依据的无缓冲 IO.相当于调用 setvbuf(stream,(char * )NULL,_IOLBF,0);
头文件: #include<cstdio>
函数声明: int setvbuf(FILE * stream,char * buf,int mode,size_t size);
说明: 在打开文件流后,读取内容之前,调用 setvbuf() 可以用来设置文件流的缓冲区
参数: