首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >文件操作

文件操作

作者头像
瑾诺学长
发布2018-09-21 16:38:53
1.4K0
发布2018-09-21 16:38:53
举报
文章被收录于专栏:专注研发专注研发

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)中读出或写入的字符数。

2.1 文件打开与关闭

[fopen][fclose]

2.1.1 fopen(打开文件)

头文件: #include<cstdio>

函数声明: FILE * fopen(const char * path,const char * mode);

参数:

  • path字符串 包含欲打开的文件路径及文件名如果没有指定文件路径,则默认为当前工作目录
  • mode字符串

使用方式 具体含义               “rt”    只读打开一个文本文件,只允许读数据 “wt”     只写打开或建立一个文本文件,只允许写数据 “at”   追加打开一个文本文件,并在文件末尾写数据 “rb”     只读打开一个二进制文件,只允许读数据 “wb”    只写打开或建立一个二进制文件,只允许写数据 “ab”     追加打开一个二进制文件,并在文件末尾写数据 “rt+”   读写打开一个文本文件,允许读和写 “wt+”   读写打开或建立一个文本文件,允许读写 “at+”   读写打开一个文本文件,允许读,或在文件末追加数据 “rb+”   读写打开一个二进制文件,允许读和写 “wb+”   读写打开或建立一个二进制文件,允许读和写 “ab+”   读写打开一个二进制文件,允许读,或在文件末追加数据

文件使用方式由r,w,a,t,b,+六个字符拼成,各字符的含义是:

  • r(read): 读 (打开只读文件,该文件必须存在)
  • w(write): 写 (打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失.若文件不存在则建立该文件)
  • a(append): 追加(以附加的方式打开只写文件.若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留)
  • t(text): 文本文件,可省略不写
  • b(banary): 二进制文件
  • +: 可读和写

说明:

  • 上述的形态字符串都可以再加一个 b 字符,如 rb、w+b 或 ab+ 等组合,加入 b 字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件.不过在 POSIX 系统,包含 Linux 都会忽略该字符.由 fopen() 所建立的新文件会具有 S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666) 权限,此文件权限也会参考 umask 值.
  • 使用 fopen() 函数打开的文件会先将文件复制到缓冲区.注意:所下达的读取或写入动作,都是针对缓冲区进行存取而不是磁盘,只有当使用 fclose() 函数关闭文件时,缓冲区中的数据才会写入磁盘.

返回值:  文件顺利打开后,指向该流的文件指针就会被返回.若果文件打开失败则返回 NULL , 并把错误代码存在 errno 中.(附加说明 一般而言,开文件后会作一些文件读取或写入的动作,若开文件失败,接下来的读写动作也无法顺利进行,所以在 fopen() 后请作错误判断及处理.)

2.1.2 fclose(关闭文件)

头文件: #include<cstdio>

函数声明: int fclose(FILE * stream);

说明: fclose() 用来关闭先前 fopen() 打开的文件.此动作会让缓冲区内的数据写入文件中,并释放系统所提供的文件资源.

返回值:

  • 若关文件动作成功则返回 0 ,有错误发生时则返回 EOF 并把错误代码存到 errno.
  • 错误代码 EBADF 表示参数 stream 非已打开的文件.

[返回子目录]

2.2 文件的读写

[fgetc][fputc][fgets][fputs][fread][fwrite][fprintf 与 fscanf][getc][getchar][gets][putc][putchar][puts][ungetc]

对文件的读和写是最常用的文件操作.在C语言中提供了多种文件读写的函数:(使用以下函数都要求包含头文件cstdio.)

  • 字符读写函数 :fgetc 和 fputc
  • 字符串读写函数:fgets 和 fputs
  • 数据块读写函数:freed 和 fwrite
  • 格式化读写函数:fscanf 和 fprinf

2.2.1 fgetc (由文件中读取一个字符)

头文件: include<cstdio>

函数声明: int fgetc(FILE * stream);

说明:

  • fgetc()从参数stream所指的文件中读取一个字符.若读到文件尾而无数据时便返回EOF.
  • 字符读取函数fgetc()可从文件数据流中一次读取一个字符,然后读取光标移动到下一个字符,并逐步将文件的内容读出

例子解析:


int ch;  ch=fgetc(fp); 其意义是从打开的文件fp中读取一个字符并送入 ch 中. 对于fgetc函数的使用有以下几点说明:

  • 在fgetc函数调用中,读取的文件必须是以读或读写方式打开的.
  • 读取字符的结果也可以不向字符变量赋值 (例如:  fgetc(fp); 但是读出的字符不能保存)
  • 在文件内部有一个位置指针,用来指向文件的当前读写字节位置,在文件打开时,该指针总是指向文件的第一个字节.使用fgetc 函数后,该位置指针将向后移动一个字节. 因此可连续多次使用fgetc函数,读取多个字符.

应注意文件指针和文件内部的位置指针不是一回事.

  • 文件指针是指向整个文件的,须在程序中定义说明,只要不重新赋值,文件指针的值是不变的.
  • 文件内部的位置指针用以指示文件内部的当前读写位置,每读写一次,该指针均向后移动,它不需在程序中定义说明,有系统自动设置而是的.

返回值 : getc() 会返回读取到的字符,若返回 EOF 则表示到了文件尾

2.2.2 fputc(将一指定字符写入文件流中)

头文件: #include<cstdio>

函数声明: int fputc(int c,FILE * stream);

说明:

  • fputc 会将参数c 转为 unsigned char 后写入参数 stream 指定的文件中.
  • 其意 putc 函数的使用几点说明:
    • 被写入的文件可以用写、读写、追加方式打开,用写或读写方式,写入字符时是从文件首开始的.如需保留原有文件内容,希望写入的字符,被写入的文件若不存在,则创建该文件.
    • 每写入一个字符,文件内部位置指针向后移动一个字节.
    • fputc 函数有一个返回值,如写入成功则返回写入的字符,否则返回一个 EOF .可用此来判断写符,写入一个文件,再把该文件内容读出显示在屏幕上.

返回值: fputc() 会返回写入成功的字符,即参数 c.若返回 EOF 则代表写入失败.

2.2.3 fgets(由文件中读取一字符串)

头文件: #include<cstdio>

函数声明: char * fgets(char * s,int size,FILE * stream);

说明: fgets() 用来从参数 stream 所指的文件内读入字符并存到参数 s 所指的内存空间,直到出现换行字符、读到文件尾或是已读了size-1个字符为止,最后会加上 NULL 作为字符串结束.

返回值: gets() 若成功则返回 s 指针,返回 NULL 则表示有错误发生.  

2.2.4 fputs(将一指定的字符串写入文件内)

头文件: #include<cstdio>

函数声明: int fputs(const char * s,FILE * stream);

说明: fputs() 用来将参数 s 所指的字符串写入到参数 stream 所指的文件内.

返回值: 若成功则返回写出的字符个数,返回 EOF 则表示有错误发生.

2.2.5 fread(从文件流读取数据)

头文件: #include<cstdio>

函数声明: size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream);

说明: fread() 用来从文件流中读取数据

参数:

  • stream 为已打开的文件指针
  • ptr 指向欲存放读取进来的数据空间,读取的字符数以参数 size*nmemb 来决定.Fread() 会返回实际读取到的 nmemb 数目,如果此值比参数 nmemb 来得小,则代表可能读到了文件尾或有错误发生,这时必须用 feof() 或 ferror() 来决定发生什么情况.

返回值: 返回实际读取到的nmemb数目.

2.2.6 fwrite(将数据写至文件流)

头文件: #include<cstdio>

函数声明: size_t fwrite(const void * ptr,size_t size,size_t nmemb,FILE * stream);

说明: 

  • fwrite() 用来将数据写入文件流中
  • fprintf 和 fscanf 函数的读写对象不是终端(标准输入输出),而是磁盘文件

参数:

  • stream 为已打开的文件指针
  • ptr 指向欲写入的数据地址,总共写入的字符数以参数 size*nmemb 来决定.Fwrite() 会返回实际写入的 nmemb 数目.

返回值: 返回实际写入的 nmemb 数目.

2.2.7 fprintf 与 fscanf(将指定字符写磁盘文件)

函数声明:

  • _CRTIMP int __cdecl fprintf(FILE *, const char *, ...);
  • _CRTIMP int __cdecl fscanf(FILE *, const char *, ...);

说明: 它们与 printf 和 scanf 函数相仿,都是格式化读写函数.不同的是:fprintf 和 fscanf 函数的读写对象不是终端(标准输入输出),而是磁盘文件.printf 函数是将内容输出到终端(屏幕),因此,fprintf 就是将内容输出到磁盘文件了

2.2.8 getc(由文件中读取一个字符)

头文件: #include<cstdio>

函数声明: int getc(FILE * stream);

说明:

  • getc() 用来从参数 stream 所指的文件中读取一个字符.若读到文件尾而无数据时便返回 EOF
  • getc() 与 fgetc() 作用相同,但 getc() 为宏定义,非真正的函数调用.

返回值: getc() 会返回读取到的字符,若返回 EOF 则表示到了文件尾.

2.2.9 getchar(由标准输入设备内读进一字符)

头文件: #include<cstdio>

函数声明: int getchar(void);

说明:

  • getchar() 用来从标准输入设备中读取一个字符.然后将该字符从 unsigned char 转换成 int 后返回
  • getchar() 非真正函数,而是 getc(stdin) 宏定义

返回值: getchar()会返回读取到的字符,若返回EOF则表示有错误发生.

2.2.10 gets(由标准输入设备内读进一字符串)

头文件: #include<cstdio>

函数声明: char * gets(char *s);

说明: gets() 用来从标准设备读入字符并存到参数 s 所指的内存空间,直到出现换行字符或读到文件尾为止,最后加上 NULL 作为字符串结束,由于 gets() 无法知道字符串 s 的大小,必须遇到换行字符或文件尾才会结束输入,因此容易造成缓冲溢出的安全性问题.建议使用 fgets() 取代

返回值: gets() 若成功则返回 s 指针,返回 NULL 则表示有错误发生.

2.2.11 putc(将一指定字符写入文件中)

头文件: #include<cstdio> 

函数声明: int putc(int c,FILE * stream);

说明:

  • putc() 会将参数 c 转为 unsigned char 后写入参数 stream 指定的文件中
  • putc() 与 fputc()作用相同,但 putc() 为宏定义,非真正的函数调用.

返回值: putc() 会返回写入成功的字符,即参数 c.若返回 EOF 则代表写入失败.

2.2.12 putchar(将指定的字符写到标准输出设备)

头文件: #include<cstdio>

函数声明: int putchar (int c);

说明:

  • putchar() 用来将参数 c 字符写到标准输出设备.
  • putchar() 非真正函数,而是 putc(c,stdout) 宏定义.

返回值: putchar() 会返回输出成功的字符,即参数 c.若返回 EOF 则代表输出失败.

2.2.13 puts(由标准输入设备内读进一字符串)

头文件: #include<cstdio>

函数声明: int puts(char *s);

说明:  把函数的字符串写到标准输出流 stdout,在输出流中用换行符('\n')替换字符串中的结束符null 字符('\0 ') 

返回值: puts() 若成功则返回正的非零值,返回 EOF 则表示有错误发生.

2.2.14 ungetc(将指定字符写回文件流中)

头文件: #include<cstdio>

函数声明: int ungetc(int c,FILE * stream);

说明: ungetc() 将参数 c 字符写回参数 stream 所指定的文件流.这个写回的字符会由下一个读取文件流的函数取得.

返回值: 成功则返回 c 字符,若有错误则返回 EOF.

[返回子目录]

2.3 文件的缓冲区操作:

[fflush] [setbuf] [setbuffer] [setlinebuf] [setvbuf]

2.3.1 fflush(更新缓冲区)

头文件: #include<cstdio>

函数声明: int fflush(FILE* stream);

说明: fflush() 会强迫将缓冲区内的数据写回参数 stream 指定的文件中.如果参数 stream 为 NULL ,fflush() 会将所有打开的文件数据更新.

返回值: 成功返回 0 ,失败返回 EOF ,错误代码存于errno中.(错误代码: EBADF 参数 stream 指定的文件未被打开,或打开状态为只读)

2.3.2 setbuf(设置文件流的缓冲区)

头文件: #include<cstdio>

函数声明: void setbuf(FILE * stream,char * buf);

说明: 在打开文件流后,读取内容之前,调用 setbuf() 可以用来设置文件流的缓冲区

参数:

  • stream为指定的文件流
  • buf 指向自定的缓冲区起始地址.如果参数 buf 为 NULL 指针,则为无缓冲 IO .Setbuf() 相当于调用 setvbuf(stream,buf,buf?_IOFBF:_IONBF,BUFSIZ)

2.3.3 setbuffer(设置文件流的缓冲区)

头文件: #include<cstdio>

函数声明: void setbuffer(FILE * stream,char * buf,size_t size);

说明: 在打开文件流后,读取内容之前,调用 setbuffer() 可用来设置文件流的缓冲区.

参数:

  • stream 为指定的文件流
  • buf 指向自定的缓冲区起始地址
  • size 为缓冲区大小

2.3.4 setlinebuf(设置文件流为线性缓冲区)

头文件: #include<cstdio>

函数声明: void setlinebuf(FILE * stream);

说明: setlinebuf() 用来设置文件流以换行为依据的无缓冲 IO.相当于调用 setvbuf(stream,(char * )NULL,_IOLBF,0); 

2.3.5 setvbuf(设置文件流的缓冲区)

头文件: #include<cstdio>

函数声明: int setvbuf(FILE * stream,char * buf,int mode,size_t size);

说明: 在打开文件流后,读取内容之前,调用 setvbuf() 可以用来设置文件流的缓冲区

参数:

  • stream 为指定的文件流
  • buf 指向自定的缓冲区起始地址
  • size 为缓冲区大小
  • mode取值有下列几种:
    • _IONBF 无缓冲 IO
    • _IOLBF 以换行为依据的无缓冲 IO
    • _IOFBF 完全无缓冲 IO.如果参数 buf 为 NULL 指针,则为无缓冲 IO

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-05-27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2.1 文件打开与关闭
    • 2.1.1 fopen(打开文件)
      • 2.1.2 fclose(关闭文件)
      • 2.2 文件的读写
        • 2.2.1 fgetc (由文件中读取一个字符)
          • 2.2.2 fputc(将一指定字符写入文件流中)
            • 2.2.3 fgets(由文件中读取一字符串)
              • 2.2.4 fputs(将一指定的字符串写入文件内)
                • 2.2.5 fread(从文件流读取数据)
                  • 2.2.6 fwrite(将数据写至文件流)
                    • 2.2.7 fprintf 与 fscanf(将指定字符写磁盘文件)
                      • 2.2.8 getc(由文件中读取一个字符)
                        • 2.2.9 getchar(由标准输入设备内读进一字符)
                          • 2.2.10 gets(由标准输入设备内读进一字符串)
                            • 2.2.11 putc(将一指定字符写入文件中)
                              • 2.2.12 putchar(将指定的字符写到标准输出设备)
                                • 2.2.13 puts(由标准输入设备内读进一字符串)
                                  • 2.2.14 ungetc(将指定字符写回文件流中)
                                  • 2.3 文件的缓冲区操作:
                                    • 2.3.1 fflush(更新缓冲区)
                                      • 2.3.2 setbuf(设置文件流的缓冲区)
                                        • 2.3.3 setbuffer(设置文件流的缓冲区)
                                          • 2.3.4 setlinebuf(设置文件流为线性缓冲区)
                                            • 2.3.5 setvbuf(设置文件流的缓冲区)
                                            领券
                                            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档