Linux中定义了与底层文件访问对应的函数库即标准I/O库,这些库函数在头文件stdio.h中定义。
1、fopen函数
#include <stdio.h>
FILE *fopen(const char *filename, const char *mode);
与底层文件访问中的open相对应。调用成功时返回一个非空的FILE指针,失败时返回NULL值。
2、fread函数及fwrite函数
#include <stdio.h>
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);
与底层访问中的read及write相对应。其中size参数指定每个记录的长度,计数器nitems给出要传输的记录数,返回成功读到缓冲区中的记录个数或成功写入的记录个数。
3、fclose函数及fflush函数
#include <stdio.h>fclose关闭文件流,在每次关闭之前都会调用fflush,把文件流里的所有未写出的数据立即写出。
int fclose(FILE *stream);
int fflush(FILE *stream);
4、fseek函数
#include <stdio.h>与底层文件访问中的lseek相对应,在文件流里为下一次读写操作指定位置。成功时返回0,失败时返回-1并设置errorn的值。
int fseek(FILE *stream, ong int offset, int whence);
5、fgetc、getc和getchar函数
#include <stdio.h>从输入流(文件流或标准输入)里取出下一个字节并作为一个字符返回。
int fgetc(FILE *stream);
int getc(FILE *stream);
int getchar();
6、fputc、putc和putchar函数
#include <stdio.h>把一个字符写入输出流中(文件流或标准输出流)。
int fputc(int c, FILE *stream);
int putc(int c, FILE *stream);
int putchar(int c);
7、fgets和gets函数
#include <stdio.h>fgets文件流中读取n-1个字符写入s中,并在s的最后加上空字节结束字符串。
char *fgets(char *s, int n, FILE *stream);
char *gets(char *s);
gets人标准输入流读取数据并丢弃遇到的换行符,并在接收字符的末尾加上一个null字节。
8、格式化输入和输出
格式化输入和输出函数包括printf、fprintf、sprintf、scanf、fscanf和sscanf。这些函数根据格式化字符串指定的格式完成输入输出操作。
在底层文件访问中可以轻松实现文件的复制,利用标准的输入输出可以简化代码,实现逐个字符的文件复制。
#include <stdio.h>上述程序复制1MB文件的测试信息如下:
int main()
{
int c;
FILE *in, *out;
in = fopen("file.in", "r");
out = fopen("file.out", "w");
while((c = fgetc(in)) != EOF)
fputc(c, out);
return 0;
}
0.03user 0.02system 0:00.06elapsed 87%CPU (0avgtext+0avgdata 1584maxresident)k
0inputs+2112outputs (0major+137minor)pagefaults 0swaps
因此利用标准输入输出提供的缓冲机制,即使是单个字符的文件复制,在效率上相对底层文件访问形式的单个字符复制有很大提高。但是我们也要意识到标准输入输出函数也存在着安全问题,比如scanf函数的实现就存在漏洞,因此对这些输入输出函数的应用也有选择性。