fopen():创建并打开与文件相关联的文件流,函数原型如下:
FILE *fopen(const char *filename, const char *mode);
返回值类型是一个指向FILE类型的指针,FILE是个结构:
fopen()函数有两个参数:文件名(filename)和模式(mode)。
一个文件需要有唯一确定的文件名,以便用户根据文件名找到唯一确定的文件,方便用户对文件的识别和引用。
文件名由三部分组成,文件路径+文件名主干+文件扩展名,如下图所示:
例如:c:\data\list.txt
1. 文件路径:"c:\data\";
2. 文件名:"list";
3. 文件扩展名:".txt";
注意:
4. 使用反斜杠'\'来分隔文件路径中的目录名;
5. C程序中,文件名以字符串的形式存储;
6. C程序中,反斜杠'\'被用作转义字符,标志着转义序列的开始;
7. C程序中,需要用两个反斜杠"\\"来表示文件路径中的目录分隔符'\',如"c:\\data\\list.txt";当从键盘输入文件名时,只需键入一个反斜杠'\';
8. C程序中,路径可省略,此时默认待打开的文件和当前C程序位于同一个目录下;
模式指定以何种方式打开文件。具体而言,模式控制打开的是文本文件还是二进制文件,是以只读方式打开,只写方式打开。还是读写的方式打开。
以打开文本文件为例,不同打开模式的含义如下图所示:
当打开二进制文件时,模式为rb、wb、ab、rb+、wb+和ab+,模式的含义都一样。
以"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"模式下,打开文件成功,代码运行结果如下图所示:
以"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,代码运行结果和文件内容如下图所示:
以"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"模式下,新数据被附加至文件末尾,代码运行结果和文件内容如下图所示:
以"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,代码运行结果和文件内容如下图所示:
以"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,代码运行结果和文件内容如下图所示:
以"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+"模式下,新数据被附加至文件末尾,代码运行结果和文件内容如下图所示: