文件操作—文件流

来源:互联网 发布:阿里云 员工收入构成 编辑:程序博客网 时间:2024/05/13 19:08
①.FILE *fopen(const char *path, const char *mode);

fopen()实现打开指定文件filename,其中的mode为打开模式,C语言中支持的打开模式如下表:

标志 含义
r, rb 以只读方式打开
w, wb 以只写方式打开。如果文件不存在,则创建该文件,否则文件被截断
a, ab 以追加方式打开。如果文件不存在,则创建该文件
r+, r+b, rb+ 以读写方式打开
w+, w+b, wh+ 以读写方式打开。如果文件不存在时,创建新文件,否则文件被截断
a+, a+b, ab+ 以读和追加方式打开。如果文件不存在,创建新文件


其中b用于区分二进制文件和文本文件,这一点在DOS、Windows系统中是有区分的,但Linux不区分二进制文件和文本文件。

②读写
C库函数支持以字符、字符串等为单位,支持按照某中格式进行文件的读写,这一组函数为:

int fgetc(FILE *stream);
int fputc(int c, FILE *stream);
char *fgets(char *s, int n, FILE *stream);
int fputs(const char *s, FILE *stream);
int fprintf(FILE *stream, const char *format, ...);
int fscanf (FILE *stream, const char *format, ...);
size_t fread(void *ptr, size_t size, size_t n, FILE *stream);
size_t fwrite (const void *ptr, size_t size, size_t n, FILE *stream);

  fread()实现从流stream中读取加n个字段,每个字段为size字节,并将读取的字段放入ptr所指的字符数组中,返回实际已读取的字段数。在读取的字段数小于num时,可能是在函数调用时出现错误,也可能是读到文件的结尾。所以要通过调用feof()和ferror()来判断。

  write()实现从缓冲区ptr所指的数组中把n个字段写到流stream中,每个字段长为size个字节,返回实际写入的字段数。

另外,C库函数还提供了读写过程中的定位能力,这些函数包括
int fgetpos(FILE *stream, fpos_t *pos);
int fsetpos(FILE *stream, const fpos_t *pos);
int fseek(FILE *stream, long offset, int whence); 
等。

关闭  利用C库函数关闭文件依然是很简单的操作:int fclose (FILE *stream);


总之,基于文件流的文件操作基本如下

1、打开文件 -- fopen
函数原型:FILE *fopen(const char *path, const char *mode);
函数参数:path --打开文件的路径
                  mode --打开文件的方式
mode权限:
r:打开只读文件,文件必须存在。
r+:打开读写文件,文件必须存在。
w:打开只写文件,文件不存在则创建。
w+:打开读写文件,文件不存在则创建。
a:以附加的形式打开只写文件,文件不存在则创建。(追加)
a+:以附加的形式打开读写文件,文件不存在则创建。
头文件:#include <stdio.h>
返回值:成功返回文件指针,失败返回NULL。

2、写入字符 -- fputc
函数原型:int fputc(int c, FILE *stream);
函数参数:c --写入的字符
                  stream --写入字符的文件流
头文件:#include <stdio.h>
返回值:成功返回写入的字符,失败返回EOF。

3、读出字符 -- fgetc
函数原型:int fgetc(FILE *stream);
函数参数:stream --读出字符的文件流
头文件:#include <stdio.h>
返回值:成功返回读取的字符,EOF表示到了文件尾。

4、写入字符串 -- fputs
函数原型:int fputs(const char *s, FILE *stream);
函数参数:s --写入的字符串
                  stream --写入字符串的文件流
头文件:#include <stdio.h>
返回值:成功返回写入的字符数,失败返回EOF。

5、读出字符串 -- fgets
函数原型:char *fgets(char *s, int size, FILE *stream);
函数参数:s --存放读取的字符串
                  size --读取的字节大小
                  stream --读出字符的文件流
头文件:#include <stdio.h>
返回值:成功返回s,失败返回EOF。

6、读取数据块 -- fread
函数原型:size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
函数参数:ptr --指向想要读取的数据空间
                  size --读取的字节大小
                  nmemb --实际读取的字节大小
                  stream --读取的文件流
头文件:#include <stdio.h>
返回值:成功返回实际读取到的nmemb数目,失败返回feof文件尾、ferror发生错误。

7、写入数据块 -- fwrite
函数原型:size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
函数参数:ptr --写入的数据
                  size --写入的字节大小
                  nmemb --总共写入的字节大小
                  stream --写入的文件流
头文件:#include <stdio.h>
返回值:成功返回实际写入的nmemb数目,失败返回feof文件尾、ferror发生错误。

8、文件流定位 -- fseek
函数原型:int fseek(FILE *stream, long offset, int whence);
函数参数:stream --定位的文件流
                  offset --移动位置(SEEK_SET文件开头 SEEK_CUR文件当前位置 SEEK_END文件末尾)
                  whence --(<0 向前,=0 当前位置,<0 向后)
头文件:#include <stdio.h>
返回值:成功返回0,失败返回-1。

9、读取文件流位置 -- ftell
函数原型:long ftell(FILE *stream);
函数参数:stream --读取位置的文件流
头文件:#include <stdio.h>
返回值:成功返回当前位置的位置,失败返回-1。

如何获得文件流的大小?
先用fseek移到文件流的末尾,再用ftell获得文件流的位置。

10、检测文件流是否到文件尾 -- feof
函数原型:int feof(FILE *stream);
函数参数:stream --检测的文件流
头文件:#include <stdio.h>
返回值:如果文件流到了文件尾,则返回非0值。

11、检测文件流是否发生错误 -- ferror
函数原型:int ferror(FILE *stream);
函数参数:stream --检测的文件流
头文件:#include <stdio.h>
返回值:如果文件流有错误,则返回非0值。

12、格式输出文件 -- fprintf
函数原型:int fprintf(FILE *stream, const char *format, ...);
函数参数:stream --输入的文件流
                  format --字符串格式
头文件:#include <stdio.h>
返回值:成功返回实际字符数,失败返回-1。

13、格式字符串输入 -- fscanf
函数原型:int fscanf(FILE *stream, const char *format, ...);
函数参数:stream --输出的文件流 format --字符串格式
头文件:#include <stdio.h>
返回值:成功返回参数数目,失败返回-1,错误原因存于errno 中。

0 0
原创粉丝点击