04-C库文件操作
5.1.2 C库文件操作
C库函数的文件操作实际上是独立于具体的操作系统平台的,不管是在DOS、Windows、Linux还是在VxWorks中都是这些函数:
1.创建和打开
FILE fopen(const char path, const char *mode);
fopen()实现打开指定文件filename,其中的mode为打开模式,C库函数中支持的打开模式如表5.3所示。
表5.3 C库函数文件打开标志
| 标 志 | 含 义 | | :----- | :----- | :----- | :----- | | r、rb | 以只读方式打开 | | w、wb | 以只写方式打开。如果文件不存在,则创建该文件,否则文件被截断 | | a、ab | 以追加方式打开。如果文件不存在,则创建该文件 | | r+、r+b、rb+ | 以读写方式打开 | | w+、w+b、wh+ | 以读写方式打开。如果文件不存在时,创建新文件,否则文件被截断 | | a+、a+b、ab+ | 以读和追加方式打开。如果文件不存在,则创建新文件 |
其中b用于区分二进制文件和文本文件,这一点在DOS、Windows系统中是有区分的,但Linux不区分二进制文件和文本文件。
2.读写
C库函数支持以字符、字符串等为单位,支持按照某种格式进行文件的读写,这一组函数为:
int fgetc(FILE *stream);
int fputc(int c, FILE *stream);
char fgets(char s, int n, FILE *stream);
int fputs(const char s, FILE stream);
int fprintf(FILE stream, const char format, ...);
int fscanf (FILE stream, const char format, ...);
size_t fread(void ptr, size_t size, size_t n, FILE stream);
size_t fwrite (const void ptr, size_t size, size_t n, FILE stream);
fread()实现从流stream中读取加n个字段,每个字段为size字节,并将读取的字段放入ptr所指的字符数组中,返回实际已读取的字段数。在读取的字段数小于num时,可能是在函数调用时出现错误,也可能是读到文件的结尾。所以要通过调用feof()和ferror()来判断。
write()实现从缓冲区ptr所指的数组中把n个字段写到流stream中,每个字段长为size个字节,返回实际写入的字段数。
另外,C库函数还提供了读写过程中的定位能力,这些函数包括:
int fgetpos(FILE stream, fpos_t pos);
int fsetpos(FILE stream, const fpos_t pos);
int fseek(FILE *stream, long offset, int whence);
3.关闭
利用C库函数关闭文件依然是很简单的操作:
int fclose (FILE *stream);
例程:将第5.1.1节中的例程用C库函数来实现,如代码清单5-2所示。
代码清单5.2 Linux文件操作用户空间编程(使用C库函数)
1 #include <stdio.h>
2 #define LENGTH 100
3 main()
4 {
5 FILE *fd;
6 char str[LENGTH];
7
8 fd = fopen("hello.txt", "w+"); / 创建并打开文件 /
9 if (fd) {
10 fputs("Hello World", fd); / 写入字符串 /
11 fclose(fd);
12 }
13
14 fd = fopen("hello.txt", "r");
15 fgets(str, LENGTH, fd); / 读取文件内容 /
16 printf("%s\n", str);
17 fclose(fd);
18 }