C语言常用文件处理函数

C语言常用文件处理函数
2009-4-27  15:50

 

 

FILE在<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;

FILE这个结构包含了文件操作的基本属性,对文件的操作都要通过这个结构的指针来进行,此种文件操作常用的函数见下表函数功能
fopen() 打开流————fclose() 关闭流
fputc() 写一个字符到流中————fgetc() 从流中读一个字符
fputs() 写字符串到流————fgets() 从流中读一行或指定个字符
fprintf() 按格式输出到流————fscanf() 从流中按格式读取 //写文本类型的文件
fread() 从流中读指定个数的字符————fwrite() 向流中写指定个数的字符  
//读写二进制类型的文件
fseek() 在流中定位到指定的字符
feof() 到达文件尾时返回真值
rewind() 复位文件定位器到文件开始处
remove() 删除文件
tmpfile() 生成一个临时文件流
tmpnam() 生成一个唯一的文件名

C语言常用文件处理函数
在实际的编程中,经常需要进行文件读写的操作。下面是笔者在学习中记录的一些常有文件处理函数。一、文件的打开与关闭
1、fopen
     调用方式:
     FILE *fp;
     fp=fopen(文件名,使用文件方式);

     说明:
     (1)、使用文件方式主要有:只读(r)、只写(w)、追加(a),还有配合"+"使用的方式,如r+、w+、a+;
     (2)、默认打开的文件为文本文件,用't'表示,可以省略。如果打开二进制的文件,则使用'b'。例如:r、rt、rb等。
     (3)、如果不能实现打开的任务,则函数返回NULL值。
2、fclose
     调用方式:
     FILE *fp;
     fclose(fp);

     说明:
     (1)、打开文件后,必须要养成关闭文件的好习惯。
     (2)、如果关闭文件出错,函数返回非零值,否则返回0.可以用ferror函数检查是否出错。

二、文件的读写
1、fputc
     调用方式:
     FILE *fp;
     char c;
     fputc(c,fp);

     说明:
     (1)、fputc向文件写入一个字符。   
     (2)、输出成功则返回值就是输出的字符,如果失败则返回一个EOF。
2、fgetc
     调用方式:
     FILE *fp;
     char c;
     c=fgetc(fp);
    
     说明:
     (1)、fgetc向文件读取一个字符。
     (2)、函数返回读取的字符,如果遇到文件结尾,则返回EOF。
     (3)、建议使用feof函数来判断是否文件结束。如果文件结束,函数feof返回值为1,否则为0。
3、fread
     调用方式:
     fread(buffer,size,count,fp);
    
     说明:
     (1)、buffer:是一个指针。对于fread来说明,它是读入数据的存放地址。对fwrite来说,是要输出数据的地址。
     (2)、size:要读写的字节数。可以使用sizeof来获得字节长度。
     (3)、count:要进行读写多少个size字的数据项。
     (4)、fp:文件指针。
     (5)、如果fread或fwrite调用成功,则函数返回值为count的值。
4、fwrite
     见fread说明。
5、fprintf和fscanf
     调用方式:
     fprintf(文件指针,格式字符串,输出列表);
     fscanf(文件指针,格式字符串,输入列表);

     说明:
     (1)、在内存与磁盘频繁交换数据的情况下,建议采用fread和fwrite实现。
三、文件的定位
1、rewind
     调用方式:
     FILE *fp;
     rewind(fp);   
     说明:
     (1)、rewind使文件的位置指针重新定位于文件开头。

2、fseek   
     调用方式:
     fseek(文件类型指针,位移量,起始点);
     说明:
     (1)、起始点用0、1、2代替,分别表示文件开始、文件当前位置、文件末尾。
     (2)、位移量指起始点为基点,向前移动的字节数。一般为long型。
     (3)、fseek常用二进制文件,可以实现随机读写。
3、ftell
      调用方式:
     FILE *fp;
     long i;
     i=ftell(fp);
     说明:
     (1)、函数返回文件当前位置,如果调用出错则返回值为-1L。
四、出错的检测
1、ferror
     调用方式:
     FILE *fp;
     ferror(fp);
     说明:
     (1)、返回值为0,表示未出错,返回值为1,表示出错。
     (2)、同一个文件每一次调用输入输出函数,均产生一个新 的ferror函数值。
     (3)、在执行fopen函数时,ferror函数的初始值自动置为0。
2、clearerr
     调用方式:
     FILE *fp;
     clearerr(fp);
     说明:
     (1):使文件错误标志和文件结束标志为0.


下面就介绍一下这些函数

1.fopen()
  fopen的原型是:FILE *fopen(const char *filename,const char *mode),fopen实现三个功能

为使用而打开一个流;把一个文件和此流相连接;给此流返回一个FILR指针
参数filename指向要打开的文件名,mode表示打开状态的字符串,其取值如下表
"r" 以只读方式打开文件
"w" 以只写方式打开文件
"a" 以追加方式打开文件
"r+" 以读/写方式打开文件,如无文件出错
"w+" 以读/写方式打开文件,如无文件生成新文件
"rb"表示以二进制模式打开只读文件
"wt+"表示以文本模式打开读/写文件

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

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

例:   FILE *fp;
  if(fp=fopen("123.456","wb"))
             puts("打开文件成功");
  else
    puts("打开文件成败");

2.fclose()
  fclose()的功能就是关闭用fopen()打开的文件,

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

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

例:fclose(fp);

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

例:fputc('X',fp);

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

例:int ch1=fgetc(fp);

5. fseek()
  此函数一般用于二进制模式打开的文件中,功能是定位到流中指定的位置,
    原型是int fseek(FILE *stream, long offset, int whence);如果成功返回0,参数offset是移动的字符数,whence是移动的基准,取值是:
符号常量 值 基准位置
SEEK_SET 0 文件开头
SEEK_CUR 1 当前读写的位置
SEEK_END 2 文件尾部

例:fseek(fp,1234L,SEEK_CUR);//把读写位置从当前位置向后移动1234字节(L后缀表示长整数)

  fseek(fp,0L,2);//把读写位置移动到文件尾

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

例:fputs("I Love You",fp);

7.fgets()
  从流中读一行或指定个字符,原型是char *fgets(char *s, int n, FILE *stream); 从流中读取n-1个字符,参数s是来接收字符串,如果成功则返回s的指针,否则返回NULL。

例:如果一个文件的当前位置的文本如下

Love ,I Have

如果用 fgets(str1,4,file1);

则执行后str1="Lov",读取了4-1=3个字符,而如果用   fgets(str1,23,file1);

则执行str="Love ,I Have",读取了一行。

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

例:fprintf(fp,"%2d%s",4,"Hahaha");

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

例:fscanf(fp,"%d%d" ,&x,&y);

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

例:if(feof(fp))printf("已到文件尾");


12.rewind()
  把当前的读写位置回到文件开始,原型是void rewind(FILE *stream);其实本函数相当于fseek(fp,0L,SEEK_SET);

例:rewind(fp);

12.remove()
  删除文件,原型是int remove(const char *filename); 参数就是要删除的文件名,成功返回0。

例:remove("c:/io.sys");

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

例:char x[4230];
  FILE *file1=fopen("c:/msdos.sys","r");
  fread(x,200,12 ,file1);//共读取200*12=2400个字节

14.fwrite()
   与fread对应,向流中写指定的数据,原型是size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);如果成功,返回实际写入的块数(不是字节数),本函数一般用于二进制模式打开的文件中。

例:char x[]="I Love You";
  fwire(x, 6,12,fp);//写入6*12=72字节

  将把"I Love"写到流fp中12次,共72字节

15.tmpfile()
  其原型是FILE *tmpfile(void); 生成一个临时文件,以"w+b"的模式打开,并返回这个临时流的指针,如果失败返回NULL。在程序结束时,这个文件会被自动删除。

例:FILE *fp=tmpfile();

16.tmpnam();
  其原型为char *tmpnam(char *s); 生成一个唯一的文件名,其实tmpfile()就调用了此函数,参数s用来保存得到的文件名,并返回这个指针,如果失败,返回NULL。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值