文章目录
- 1 函数原型
- 2 返回值
- 3 参数
- 3.1 文件名
- 3.2 模式
- 3.2.1 以"r"模式打开
- 3.2.2 以"w"模式打开
- 3.2.3 以"a"模式打开
- 3.2.4 以"r+"模式打开
- 3.2.5 以"w+"模式打开
- 3.2.6 以"a+"模式打开
1 函数原型
fopen():创建并打开与文件相关联的文件流,函数原型如下:
FILE *fopen(const char *filename, const char *mode);
2 返回值
fopen()的返回值类型是一个指向FILE类型的指针,FILE是个结构:
- 打开文件成功,则创建一个FILE类型结构的实例,并返回指向该结构实例的指针,程序使用该指针来操作文件;
- 打开文件失败,则返回NULL;导致文件打开失败的原因有很多,如:
(1)使用无效的文件名;
(2)试图在未准备好的磁盘上打开文件(如磁盘未格式化);
(3) 文件的目录或盘符不存在;
(4) 以"r"和"r+"模式打开并不存在的文件。
3 参数
fopen()函数有两个参数:文件名(filename)和模式(mode)。
3.1 文件名
一个文件需要有唯一确定的文件名,以便用户根据文件名找到唯一确定的文件,方便用户对文件的识别和引用。
文件名由三部分组成,文件路径+文件名主干+文件扩展名,如下图所示:
例如:c:\data\list.txt1. 文件路径:"c:\data\";
2. 文件名:"list";
3. 文件扩展名:".txt";注意:
4. 使用反斜杠'\'来分隔文件路径中的目录名;
5. C程序中,文件名以字符串的形式存储;
6. C程序中,反斜杠'\'被用作转义字符,标志着转义序列的开始;
7. C程序中,需要用两个反斜杠"\\"来表示文件路径中的目录分隔符'\',如"c:\\data\\list.txt";当从键盘输入文件名时,只需键入一个反斜杠'\';
8. C程序中,路径可省略,此时默认待打开的文件和当前C程序位于同一个目录下;
3.2 模式
模式指定以何种方式打开文件。具体而言,模式控制打开的是文本文件还是二进制文件,是以只读方式打开,只写方式打开。还是读写的方式打开。
以打开文本文件为例,不同打开模式的含义如下图所示:
当打开二进制文件时,模式为rb、wb、ab、rb+、wb+和ab+,模式的含义都一样。
3.2.1 以"r"模式打开
以"r"模式打开文件"1.txt",代码如下图所示:
int main()
{FILE* fp = NULL;if ((fp = fopen("1.txt", "r")) == NULL){printf("Failed to open file in \"r\" mode.\n");exit(1);}else{printf("Success to open file in \"r\" mode.\n");fclose(fp);}return 0;
}
当文件不存在时,在"r"模式下,打开文件失败,代码运行结果如下图所示:
当文件存在时,在"r"模式下,打开文件成功,代码运行结果如下图所示:
3.2.2 以"w"模式打开
以"w"模式打开文件"2.txt",代码如下图所示:
int main()
{FILE* fp = NULL;if ((fp = fopen("2.txt", "w")) == NULL){printf("Failed to open file in \"w\" mode.\n");exit(1);}else{printf("Success to open file in \"w\" mode.\n");for (int i = 0; i < 10; i++){fputc('2', fp);}fclose(fp);}return 0;
}
当文件不存在时,在"w"模式下,创建新文件,代码运行结果和文件内容如下图所示:
当文件存在时,在"w"模式下,清空现有文件,修改代码往文件中写入5个a,代码运行结果和文件内容如下图所示:
3.2.3 以"a"模式打开
以"a"模式打开文件"3.txt",代码如下图所示:
int main()
{FILE* fp = NULL;if ((fp = fopen("3.txt", "a")) == NULL){printf("Failed to open file in \"w\" mode.\n");exit(1);}else{printf("Success to open file in \"w\" mode.\n");for (int i = 0; i < 10; i++){fputc('3', fp);}fclose(fp);}return 0;
}
当文件不存在时,在"a"模式下,创建新文件,代码运行结果和文件内容如下图所示:
当文件存在时,在"a"模式下,新数据被附加至现有文件末尾,代码运行结果和文件内容如下图所示:
3.2.4 以"r+"模式打开
以"r+“模式打开文件"4.txt”,代码如下图所示:
int main()
{FILE* fp = NULL;if ((fp = fopen("4.txt", "r+")) == NULL){printf("Failed to open file in \"r+\" mode.\n");exit(1);}else{printf("Success to open file in \"r+\" mode.\n");for (int i = 0; i < 10; i++){fputc('4', fp);}fclose(fp);}return 0;
}
当文件不存在时,在"r+"模式下,打开文件失败,代码运行结果如下图所示:
当文件存在时,在"r+"模式下,新数据从头开始覆盖现有文件数据,文件初始内容为20个b,代码运行结果和文件内容如下图所示:
3.2.5 以"w+"模式打开
以"w+“模式打开文件"5.txt”,代码如下图所示:
int main()
{FILE* fp = NULL;if ((fp = fopen("5.txt", "w+")) == NULL){printf("Failed to open file in \"w+\" mode.\n");exit(1);}else{printf("Success to open file in \"w+\" mode.\n");for (int i = 0; i < 10; i++){fputc('5', fp);}fclose(fp);}return 0;
}
当文件不存在时,在"w+"模式下,创建新文件,代码运行结果和文件内容如下图所示:
当文件存在时,在"w+"模式下,清空现有文件,修改代码往文件中写入5个c,代码运行结果和文件内容如下图所示:
3.2.6 以"a+"模式打开
以"a+“模式打开文件"6.txt”,代码如下图所示:
int main()
{FILE* fp = NULL;if ((fp = fopen("6.txt", "a+")) == NULL){printf("Failed to open file in \"a+\" mode.\n");exit(1);}else{printf("Success to open file in \"a+\" mode.\n");for (int i = 0; i < 10; i++){fputc('6', fp);}fclose(fp);}return 0;
}
当文件不存在时,在"a+"模式下,创建新文件,代码运行结果和文件内容如下图所示:
当文件存在时,在"a+"模式下,新数据被附加至现有文件末尾,代码运行结果和文件内容如下图所示: