C文件操作函数 .

转自http://blog.csdn.net/pingnanlee/article/details/8248570

ANSI C中对于文件的操作方式有两种,一种是基于流的方式,另外一种就是基于I/O的方式。


1、基于流的方式有一个重要的数据结构,定义在stdio.h中

typedef struct {

int level; /* fill/empty level of buffer */
unsigned flags; /* File status flags */
char fd; /* File descriptor */
unsigned char hold; /* Ungetc char if no buffer */
int bsize; /* Buffer size */
unsigned char _FAR *buffer; /* Data transfer buffer */
unsigned char _FAR *curp; /* Current active pointer */
unsigned istemp; /* Temporary file indicator */
short token; /* Used for validity checking */
} FILE; /* This is the FILE object */

主要的函数有下面这些:

1)fopen
fopen的原型是:FILE *fopen(const char *filename,const char *mode),此函数返回一个FILE指针,所以申明一个FILE指针后不用初始化,而是用fopen()来返回一个指针并与一个特定的文件相连,如果成败则返回NULL。

fopen实现三个功能
1.打开一个流
2.文件和流相连接
3.给流返回一个FILE指针

参数filename指向要打开的文件名,mode表示打开状态的字符串,其取值如下:
"r" 以只读方式打开文件
"w" 以只写方式打开文件
"a" 以追加方式打开文件
"r+" 以读/写方式打开文件,如无文件出错
"w+" 以读/写方式打开文件,如无文件生成新文件

  一个文件可以以文本模式或二进制模式打开,这两种的区别是:在文本模式中回车被当成一个字符'\n',而二进制模式认为它是两个字符0x0D,0x0A;如果在文件中读到0x1B,文本模式会认为这是文件结束符,这就是说二进制模型不会对文件进行处理,而文本方式会按一定的方式对数据作相应的转换。

  系统默认的是以文本模式打开,可以修改全局变量_fmode的值来修改这个设置,例如_fmode=O_TEXT;就设置默认打开方式为文本模式;而_fmode=O_BINARY;则设置默认打开方式是二进制模式。

  我们也可以在模式字符串中指定打开的模式,如"rb"表示以二进制模式打开只读文件,"w+t"或"wt+"表示以文本模式打开读/写文件。

2)fclose
fclose的原型是:int fclose(FILE *fp),如果成功,返回0,失败返回EOF。

它的功能就是关闭用fopen()打开的文件。在程序结束时一定要记得关闭打开的文件,不然可能会造成数据丢失的情况。

3)fputc
原型是int fputc(int c, FILE *stream); 成功返回这个字符,失败返回EOF。作用是向流写一个字符。

4)fgetc
原型是int fputc(FILE *stream); 成功返回这个字符,失败返回EOF。作用是从流中读一个字符。

5)fputs
写一个字符串到流中,原型int fputs(const char *s, FILE *stream);

6)fgets
原型是char *fgets(char *s, int n, FILE *stream); 从流中读取n-1个字符,除非读完一行(当读完一行时,字符串中不包括行尾的'\n'),参数s是来接收字符串,如果成功则返回s的指针,否则返回NULL。

7)fprintf
按格式输入到流,其原型是int fprintf(FILE *stream, const char *format[, argument, ...]);其用法和printf()相同,不过不是写到控制台,而是写到流。

8)fscanf
从流中按格式读取,其原型是int fscanf(FILE *stream, const char *format[, address, ...]);其用法和scanf()相同,不过不是从控制台读取,而是从流读取。

9)feof
检测是否已到文件尾,是返回真,否则返回0,其原型是int feof(FILE *stream);

10)ferror
原型是int ferror(FILE *stream);返回流最近的错误代码,可用clearerr()来清除它,clearerr()的原型是void clearerr(FILE *stream)。

11)fread
从流中读指定个数的字符,原型是size_t fread(void *ptr, size_t size, size_t n, FILE *stream);参数ptr是保存读取的数据,void*的指针可用任何类型的指针来替换,如char*、int *等等来替换;size是每块的字节数;n是读取的块数,如果成功,返回实际读取的块数(不是字节数),本函数一般用于二进制模式打开的文件中。

12)fwrite
向流中写指定的数据,原型是size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);参数ptr是要写入的数据指针,void*的指针可用任何类型的指针来替换,如char*、int *等等来替换;size是每块的字节数;n是要写的块数,如果成功,返回实际写入的块数(不是字节数),本函数一般用于二进制模式打开的文件中。

13)ftell
原型是int ftell(FILE *stream),该函数可以得到当前位置指针相对于文件起始位置的字节数。函数调用出错时返回-1。


2、基于I/O的方式

这是C提供的另一种文件操作,它是通过直接存/取文件来完成对文件的处理,基于流的文件操作是通过缓冲区来进行;基于流的文件操作是围绕一个FILE指针来进行,而此类文件操作是围绕一个文件的“句柄”来进行(句柄是所有设备资源的标识)。此类文件操作常用的函数及其所用的一些符号在io.h和fcntl.h。

open() 打开一个文件并返回它的句柄
close() 关闭一个句柄
lseek() 定位到文件的指定位置
read() 块读文件
write() 块写文件
eof() 测试文件是否结束

具体的使用方式不再介绍了, 这里总结一些这两种方式的主要区别:

无缓存IO操作数据流向路径:数据——内核缓存区——磁盘 

有缓存文件操作数据流向路径:数据——流缓存区——内核缓存区——磁盘

实际上基于流的文件操作,最终还是调用了I/O的方式。所以基于流的方式,在某种程度上可以避免对系统调用的调用次数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值