提示:以下为本人学习记录,如有错误还请谅解
前言
标准 I/O 库函数是构建于文件 I/O(open()、read()、write()、lseek()close()等)这些系统调用之上的,譬如标准 I/O 库函数 fopen()就利用系统调用 open()来执行打开文件的操作、fread()利用系统调用 read()来执行读文件操作、fwrite()则利用系统调用 write()来执行写文件操作等等。说白了就是对文件IO的封装,标准 I/O 内部实际上是调用文件 I/O 来完成实际操作的。但是在某些方面标准IO是优于文件IO,比如在性能、效率上,标准 I/O 要优于文件 I/O。
一、FILE 指针
文件 I/O 函数(open()、read()、write()、lseek()等)都是围绕文件描述符进行的,当调用 open()函数打开一个文件时,即返回一个文件描述符 fd,然后该文件描述符就用于后续的 I/O 操作。对于标准I/O而言它们的操作是围绕 FILE 指针进行的,当使用标准 I/O 库函数打开或创建一个文件时,会返回一个指向 FILE 类型对象的指针(FILE *),使用该 FILE 指针与被打开或创建的文件相关联,然后该 FILE 指针就用于后续的标准 I/O 操作
二、打开文件 fopen()
fopen函数原型如下
#include <stdio.h>
FILE *fopen(const char *path, const char *mode);
其中mode为字符串类型可取值如下
r :以只读方式打开文件。
r+: 以可读、可写方式打开文件。
w:以只写方式打开文件,如果参数 path 指定的文件存在,将文件长度截断为 0;如果指定文件不存在则创建该文件。
w+:以可读、可写方式打开文件,如果参数 path 指定的文件存在,将文件长度截断为 0;如果指定文件不存在则创建该文件。
a:以只写方式打开文件,打开以进行追加内容(在文件末尾写入),如果文件不存在则创建该文件。
a+:以可读、可写方式打开文件,以追加方式写入(在文件末尾写入),如果文件不存在则创建该文件。
###用 fopen()函数新建文件时无法手动指定文件的权限,但却有一个默认值:S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH (0666)
三、标准I/O简单使用示例
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char buf[] = "Hello World!\n";
FILE *fp = NULL;
/* 打开文件 */
if (NULL == (fp = fopen("./test_file", "w"))) {
perror("fopen error");
exit(-1);
}
printf("文件打开成功!\n");
/* 写入数据 */
if (sizeof(buf) >
fwrite(buf, 1, sizeof(buf), fp)) {
printf("fwrite error\n");
fclose(fp);
exit(-1);
}
printf("数据写入成功!\n");
/* 关闭文件 */
fclose(fp);
exit(0);
}
首先使用 fopen()函数将当前目录下的 test_file 文件打开,调用 fopen()时 mode 参数设置为"w",表示以只写的方式打开文件,并将文件的长度截断为 0,如果指定文件不存在则创建该文件。打开文件之后调用fwrite()函将"Hello World!"字符串数据写入到文件中。