标准I/O库之文件操作的函数

标准I/O库

标准I/O库(stdio)及其头文件stdio.h为地城i/o系统调用提供了一个通用的接口。这个库已经成为ANSI标准C的一部分。标准I/O库提供了许多复杂的函数用于格式化输出和扫描输入。它还负责满足设备的缓冲需求。
在很多方面,使用标准I/O库的方式和使用底层文件描述符一样。需要先打开一个文件以建立一个访问路径。这个操作的返回值将作为其他I/O库函数的参数。在标准I/O库中,与底层文件描述符对应的是流(stream),它被实现为指向结构FILE的指针。
在启动程序时,有三个文件流是自动打开的。它们是stdinstdoutstderr。它们都是在stdio.h文件里定义的,分别代表着标准输入、标准输出和标准错误输出,与底层文件描述符0、1和2相对应。
下面来介绍标准I/O库中的下列库函数:

fopen函数

fopen库函数类似于底层的open系统调用。它主要用于文件和终端的输入输出。如果需要对设备进行明确的控制,那最好使用底层系统调用,因为这可以避免用库函数带来的一些潜在问题,如输入/输出缓冲。
该函数的原型如下:
FILE*fopen(const char *filename,const char*mode);
fopen打开由filename参数指定的文件,并把它与一个文件流关联起来。mode参数指定文件打开方式,它取下列字符串中的值。
“r”或“rb”:以只读方式打开,r代表打开文本文件,“rb”代表打开二进制文件。
“w”或“wb”:以写方式打开,并把文件长度截短为零(如果文件本身已经存在,那么这里将原来的内容删除,文件长度为0,重新开始写入,如果文件本身不存在,则会创建一个空文件用于操作)。
“a”或“ab”:以写方式打开,新内容追加在文件尾。
“r+”或“rb+”或“r+b”:以更新方式打开(读和写)。
“w+”或“wb+”或“w+b”:以更新方式打开,并把文件长度截短为零。
“a+”或“ab+”或“a+b”:以更新方式打开,新内容追加在文件尾。
注意:字母b表示文件是一个二进制文件而不是文本文件。mode参数,必须是一个字符串,而不是一个字符,所以总是使用双引号,而不是单引号。
fopen在成功时返回一个非空的FILE*指针,失败时返回NULL值,NULL值在头文件stdio.h里定义。可用的文件流数量和文件描述符一样,都是有限制的。实际的限制是由头文件stdio.h中定义的FOPEN_MAX来定义的,它的值至少为8,在Linux系统中,通常是16。

fread函数&fwrite函数

fread库函数用于从一个文件流里读取数据。数据从文件流stream读到由ptr指向的数据缓冲区里。fread和fwrite都是对数据记录进行操作,size参数指定每个数据记录的长度,计数器nitems给出要传输的记录个数。它的返回值是成功读到数据缓冲区里的记录个数(而不是字节数)。当到达文件尾时,它的返回值可能会小于nitems,甚至可以是0。
这两个函数的原型如下:
size_t fread(void*ptr,size_t size,size_t nitems,FILE*stream);
size_t fwrite(const void *ptr,size_t size,size_t nitems,FILE*stream);
注意:
这里不推荐把fread和fwrite用于结构化数据。部分原因在于用fwrite写的文件在不同的计算机体系结构之间可能不具备可移植性。

测试用例

这里以fwrite函数作为测试对象吧!

代码
#include<stdio.h>
#include<string.h>
int main()
{
    FILE*fp = fopen("file","w");
    char buff[128] = {0};
    fgets(buff,127,stdin);
    printf("buff is %s",buff);
    fwrite(buff,sizeof(char),strlen(buff)-1,fp);
    fclose(fp);
    return 0;
}

结果
fopen

fclose函数

fclose库函数关闭指定的文件流stream,使所有尚未写出的数据都写出。因为stdio库会对数据进行缓冲,所以使用fclose是很重要的。如果程序需要确保数据已经全部写出,就应该调用fclose函数。虽然当程序正常结束时,会自动对所有还打开的文件流调用fclose函数,但这样做就没有机会检查fclose报告的错误了。
该函数原型如下:
int fclose(FILE*stream);

fflush函数

fflush库函数的作用是把文件流里的所有未写出数据立刻写出。例如,可以用这个函数来确保在试图读入一个用户响应之前,先向终端送出一个交互提示符。使用这个函数还可以确保在程序继续执行之前重要的数据都已经被写在磁盘上。调用fclose函数隐含执行了一次flush操作,所以在fclose之前就不必再调用一次fflush了。
该函数的原型如下:
int fflush(FILE*stream);

fgetc、getc和getchar函数

fgetc函数从文件流里取出下一个字节并把它作为一个字符返回。当它到达文件尾或者出现错误时,它返回EOF。如果出现这种情况,就必须通过ferror或feof来区分这两种情况。这些函数的原型如下:
int fgetc(FILE*stream);
int getc(FILE*stream);
int getchar();
int feof(FILE*stream);
int ferror(FILE*stream);
getc函数的作用和fgetc一样。
getchar函数的作用相当于getc(stdin),它从标准输入里读取下一个字符。

fputc、putc和putchar函数

这些函数的原型如下:
int fputc(int c,FILE*stream);
int putc(int c,FILE*stream);
int putchar(int c);
fputc函数把一个字符写到一个输出文件流中。它返回写入的值,如果失败,则返回EOF。
类似于fgetc和getc之间的关系,putc函数的作用页相当于fputc。
putchar函数相当于putc(c,stdout),它把单个字符写到标准输出。**注意,**putchar和getchar都是把字符当做int类型而不是char类型来使用的。这就允许文件尾(EOF)标识取值-1,这是一个超出字符数字编码范围的值。

fgets和gets函数

函数原型如下:
char*fgets(char*s,int n,FILE*stream);
char *gets(char*s);
fgets把读到的字符写到s指向的字符串里,直到出现下面某种情况:遇到换行符,已经传输了n-1个字符,或者到达文件尾。它会吧遇到的换行符也传递到接收字符串里,再加上一个表示结尾的空字节\0。一次调用最多只能传输n-1个字符,因为它必须把空字节加上以结束字符串。
当成功完成时,fgets返回一个指向字符串s的指针。如果文件流已经到达文件尾,fgets会设置这个文件流的EOF标识并返回一个空指针。如果出现读错误,fgets返回一个空指针并设置errno以指出错误的类型。
gets函数类似于fgets,只不过它从标准输入读取数据并丢弃遇到的换行符。它在接收字符串的尾部加上一个null字节。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值