Linux程序设计——文件操作(标准I/O库)

时间:2022-08-28 01:50:45

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>
int fclose(FILE *stream);
int fflush(FILE *stream);
fclose关闭文件流,在每次关闭之前都会调用fflush,把文件流里的所有未写出的数据立即写出。


4、fseek函数

#include <stdio.h>
int fseek(FILE *stream, ong int offset, int whence);
与底层文件访问中的lseek相对应,在文件流里为下一次读写操作指定位置。成功时返回0,失败时返回-1并设置errorn的值。


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>
char *fgets(char *s, int n, FILE *stream);
char *gets(char *s);
fgets文件流中读取n-1个字符写入s中,并在s的最后加上空字节结束字符串。

gets人标准输入流读取数据并丢弃遇到的换行符,并在接收字符的末尾加上一个null字节。


8、格式化输入和输出

格式化输入和输出函数包括printf、fprintf、sprintf、scanf、fscanf和sscanf。这些函数根据格式化字符串指定的格式完成输入输出操作。


在底层文件访问中可以轻松实现文件的复制,利用标准的输入输出可以简化代码,实现逐个字符的文件复制。

#include <stdio.h>

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;
}
上述程序复制1MB文件的测试信息如下:

0.03user 0.02system 0:00.06elapsed 87%CPU (0avgtext+0avgdata 1584maxresident)k
0inputs+2112outputs (0major+137minor)pagefaults 0swaps

因此利用标准输入输出提供的缓冲机制,即使是单个字符的文件复制,在效率上相对底层文件访问形式的单个字符复制有很大提高。但是我们也要意识到标准输入输出函数也存在着安全问题,比如scanf函数的实现就存在漏洞,因此对这些输入输出函数的应用也有选择性。