C语言与文件操作相关函数总结

来源:互联网 发布:网络分销策略 编辑:程序博客网 时间:2024/05/01 23:14

相关概念

1.如何设计命名文件的读取过程?换句话说,如何将用户需要使用的文件的外部名读取数据的语句关联起来?

    在读写一个文件之前,必须通过fopen函数打开改文件。fopen函数用文件的外部名(包括扩展名)与操作系统进行某系必要的连接与通信,并返回一个用于文件读写操作的指针。

 

2.文件指针

#include<stdio.h>FILE *fp;


    fp为文件指针,它指向一个包含文件信息的结构。这些信息包括:缓冲区的位置、缓冲区中当前字符的位置、文件的读或者写状态、是否出错或是是否已经到达文件结尾等等。

    <stdio.h>中定义了一个包含这些信息的结构FILE。其中,FILE是类型名,而不是结构标记。它是通过typedef定义的。

 

3.stdin, stdout, stderr

    启动一个C语言程序时,操作系统负责打开3个文件并将这三个文件的指针提供给该程序。 这三个文件是:标准输入标准输出标准错误。相应的文件指针分别为:stdin,stdout和stderr.它们在<stdio.h>中声明。

    在大多数环境中,stdin指向键盘,stdout和stderr指向显示器。stdin和stdout可被重定向到文件或管道。

 

相关函数

1.fopen 与 fclose

FILE *fopen(char *name, char *mode);int fclose(FILE *fp);


fopen()的第一个参数是一个字符串,它包含文件名以及文件的扩展名。第二个参数是访问模式,也是一个字符串,用于指定文件的使用方式。允许的访问模式包括:读("r")、写("w")、追加("a")。

FILE *fp =  fopen("1.txt","r");

如果打开一个不存在的文件用于写或者追加,该文件将被创建(可能的话)。读一个不存在的文件将导致错误。其他一些操作也可能导致错误,比如试图读取一个无权的文件。

如果发生错误,fopen将返回NULL(正常情况下返回文件指针)。

 

fclose()执行与fopen()相反的操作,它断开有fopen()函数建立的文件指针与外部名之间的连接,并释放文件指针以供其他文件使用。

因为大多数操作系统都限制了一个程序可以同时打开的文件数,所以,当文件指针不再需要时就应该立即释放。使用fclose()函数会把缓冲区内剩余的数据输出到所定义的输出中,并释放文件指针和有关的缓冲区。

当程序正常终止时,程序会自动为每个打开的文件调用fclose函数。

成功关闭流时返回0,否则返回EOF(-1).

 

2.getc 与putc

int getc(FILE *fp);int putc(int c, FILE *fp);


getc()返回fp指向的输入流中的下一个字符。如果到达文件末尾或出现错误,则返回EOF

putc()将字符c写入到fp指向的文件中,并返回写入的字符。如果发生错误,则返回EOF

 

类似于getchar和putchar,getc和putc是宏而不是函数

#define getchar() getc(stdin)#define putchar() putc((c),stdout)

 

3.fgets 与 fputs

char *fgets(char *s, int n, FILE *fp);int fputs(char *line, FILE *fp);


从文件指针fp中读取n-1个字符,存到以s为起始地址的空间里,直到读完一行。如果成功则返回s的指针,否则返回NULL

若在未读满n-1个字符之时已读到一个换行符或一个EOF(文件结束标志),则结束本次读操作,读入的字符串中最后包含读到的换行符。读入结束后,系统将自动在字符串后追加写入'\0'

 

fputs函数在指定的文件写入一个字符串不自动写入字符串结束标记符‘\0’)。

成功写入一个字符串后,文件的位置指针会自动后移,函数返回值为0;否则返回EOF(-1)。


4.fsancf 与 fprintf

int fscanf(FILE *fp, char *format,...);int fprintf(FILE *fp, char *format,...);


用于文件的标准化输入输出。它们与printf和scanf的唯一区别仅在于它们的第一个参数是一个指向所要读写的文件的指针。

 

5.stderr 与 exit

#include<stdlib.h>char *prog = argv[0];if((fp=fopen(*++argv,"r"))==NULL){    fprintf(sdterr,"%s:can't open %s\n",*prog,*argv);    exit(1);}


fprintf()将产生的诊断信息输出到stderr上,因此诊断信息会显示在屏幕上,而不是仅仅输出到管道或者输出文件中。

exit()包含在<stdlib.h>中,当该函数被调用时,它将终止调用程序(不仅仅是结束当前函数!!)任何调用该程序的进程都可以获得exit的参数值。因此,可通过另一个将改程序作为子进程的程序来测试该程序的执行是否成功。

按照惯例,返回值0表示一切正常,非0返回值表示出现异常情况。

exit函数为每个已打开的输出文件调用fclose函数,以将缓冲区中的所有输出写到相应的文件中。

 

6. ferror 与 feof

int ferror(FILE *fp);int fero(FILE *fp);


在调用各种输入输出函数(如 putc.getc.fread.fwrite等)时,如果出现错误,除了函数返回值有所反映外,还可以用ferror函数检查。

它的一般调用形式为 ferror(fp);如果ferror返回值为0(假),表示未出错。如果返回一个非零值,表示出错。应该注意,对同一个文件 每一次调用输入输出函数,均产生一个新的ferror函 数值,因此,应当在调用一个输入输出函数后立即检 查ferror函数的值,否则信息会丢失。在执行fopen函数时,ferror函数的初始值自动置为0。

 

feof()函数检测流上的文件结束符。当指定的文件到达文件末尾,它将返回一个非0值,否则返回0。

在文本文件中,数据是以字符的ASCⅡ代码值的形式存放的。普通字符的ASCⅡ代码的范围是32到127(十进制),EOF的16进制代码为0x1A(十进制为26),因此可以用EOF作为文本文件的结束标志。

在二进制文件中,就会有-1值的出现,因此不能采用EOF作为二进制文件的结束标志。为解决这一个问题,ASCI C提供一个feof函数,用来判断文件是否结束。feof函数既可用以判断二进制文件又可用以判断文本文件。

feof()可以用EOF代替吗?不可以。因为当fgetc返回-1时,有两种情况:读到文件结尾或是读取错误。我们无法确信文件已经结束, 因为可能是读取错误! 这时我们需要feof()。

原创粉丝点击