大家好,又见面了,我是你们的朋友全栈君。
文章目录
- 一、fopen 函数
- 二、fopen 函数文件打开方式详解
-
- 1、r
- 2、r
- 3、rb
- 4、rb 与 r 对比
- 5、rw
- 6、w
- 7、w
- 8、a
- 9、a
- 三、文件打开方式总结
一、fopen 函数
fopen 函数用于打开文件 , 函数原型如下 ;
代码语言:javascript复制FILE *fopen(const char *filename, const char *mode);
const char *filename 参数 : 文件名 ;
const char *mode 参数 : 文件的打开方式 ;
二、fopen 函数文件打开方式详解
1、r
r : 以只读方式打开 , 文件必须存在 ;
- 如果文件存在 , 则 文件打开成功 ;
- 如果文件不存在 , 返回的 FILE *p 为 NULL ;
通过判定 FILE* 类型的返回值是否为 NULL , 可以判断文件是否打开成功 , 文件不存在 , 权限不足 , 等都会导致文件打开失败 ;
代码语言:javascript复制#include <stdio.h>
int main()
{
// 以 r 方式打开文件
FILE *p = fopen("D:\a.txt", "r");
if(p == NULL)
{
printf("File Open Failed !n");
}else
{
printf("File Open Success !n");
// 如果打开成功 , 则需要关闭文件
fclose(p);
}
printf("Main Endn");
return 0;
}
文件存在 , 则打开成功 ;
文件不存在则打开失败 ;
2、r
r : 以读写方式打开文件 ; 文件必须存在 ;
- 如果文件存在 , 则 文件打开成功 ;
- 如果文件不存在 , 返回的 FILE *p 为 NULL ;
类似于 r , 凡是与 r 相关的 , 文件必须存在 ;
3、rb
rb : 以 读写的方式 打开 二进制文件 ; 文件必须存在 ;
- 如果文件存在 , 则 文件打开成功 ;
- 如果文件不存在 , 返回的 FILE *p 为 NULL ;
类似于 r , 凡是与 r 相关的 , 文件必须存在 ;
代码示例 :
代码语言:javascript复制#include <stdio.h>
int main()
{
// 以 rb 读写方式 打开 二进制文件
FILE *p = fopen("D:\a.txt", "rb ");
if(p == NULL)
{
printf("File Open Failed !n");
}else
{
printf("File Open Success !n");
fputs("Hellon", p);
fputs("Worldn", p);
// 如果打开成功 , 则需要关闭文件
fclose(p);
}
printf("Main Endn");
return 0;
}
执行结果 : 使用文本查看工具输出
代码语言:javascript复制Hello
World
使用二进制查看工具 , 输出结果 : 其中 0x0A 指的是 ‘n’ 字符 ;
代码语言:javascript复制48 65 6C 6C 6F 0A 57 6F 72 6C 64 0A
4、rb 与 r 对比
在上面使用 ” rb ” 的方式打开文件 , 是以二进制形式打开的文件 , 二进制输出内容为
代码语言:javascript复制48 65 6C 6C 6F 0A 57 6F 72 6C 64 0A
下面的代码中 , 使用 ” r ” 的方式打开文件 , 是以文本形式打开的文件 , 二进制输出内容为
代码语言:javascript复制48 65 6C 6C 6F 0D 0A 57 6F 72 6C 64 0D 0A
其中 0D 是 ‘r’ , 0A 是 ‘n’ , 文本形式中换行被解析为 “rn” , 二进制形式只有 ‘n’ ;
在 Windows 系统下 , 文本都是以 “rn” 作为换行符号 ;
在 Linux / Unix 系统下 , 文本都是以 ‘n’ 作为换行符号 ;
代码示例 :
代码语言:javascript复制#include <stdio.h>
int main()
{
// 以 rb 读写方式 打开 二进制文件
FILE *p = fopen("D:\a.txt", "r ");
if(p == NULL)
{
printf("File Open Failed !n");
}else
{
printf("File Open Success !n");
fputs("Hellon", p);
fputs("Worldn", p);
// 如果打开成功 , 则需要关闭文件
fclose(p);
}
printf("Main Endn");
return 0;
}
文本方式下 , 换行是 0D 0A
, 二进制方式下 , 将数据原封不动输出 ;
在 Windows 下使用文本模式和二进制模式读写数据是不同的 ;
但在 Linux / Unix 下使用文本模式和二进制模式读写文件没有区别 ;
5、rw
rw : 以读写方式打开文本文件 , 允许读写 ;
- 如果文件存在 , 则 文件打开成功 ;
- 如果文件不存在 , 返回的 FILE *p 为 NULL ;
- 写出时 , 将该文件原有数据覆盖 , 即文件长度清 0 0 0 , 删除文件内容 , 重新写入文件内容 ;
代码示例 :
代码语言:javascript复制#include <stdio.h>
int main()
{
// 以 rw 读写方式 打开文件
FILE *p = fopen("D:\a.txt", "rw ");
if(p == NULL)
{
printf("File Open Failed !n");
}else
{
printf("File Open Success !n");
fputs("Hellon", p);
fputs("Worldn", p);
// 如果打开成功 , 则需要关闭文件
fclose(p);
}
printf("Main Endn");
return 0;
}
如果文件存在 , 则文件打开成功 , 写出数据成功 , 写出时覆盖之前的内容 ;
如果文件不存在 , 则打开失败 ;
6、w
w : 以写的方式打开文件 ;
- 如果文件不存在 , 就创建文件 ;
- 如果文件存在 , 覆盖原有数据重新写入数据 ;
- 写出时 , 将该文件原有数据覆盖 , 即文件长度清 0 0 0 , 删除文件内容 , 重新写入文件内容 ;
#include <stdio.h>
int main()
{
// 以 w 方式打开文件
FILE *p = fopen("D:\a.txt", "a");
if(p == NULL)
{
printf("File Open Failed !n");
}else
{
fputs("hellon", p);
// 如果打开成功 , 则需要关闭文件
fclose(p);
}
printf("Main Endn");
return 0;
}
执行结果 : 该程序无论执行多少次 , 显示的结果都是 hello ;
7、w
w : 以 读写的方式 打开文件 ;
- 如果文件不存在 , 就创建文件 ;
- 如果文件存在 , 覆盖原有数据重新写入数据 ;
- 写出时 , 将该文件原有数据覆盖 , 即文件长度清 0 0 0 , 删除文件内容 , 重新写入文件内容 ;
代码示例 :
代码语言:javascript复制#include <stdio.h>
int main()
{
// 以 w 读写方式 打开 二进制文件
FILE *p = fopen("D:\a.txt", "w ");
if(p == NULL)
{
printf("File Open Failed !n");
}else
{
printf("File Open Success !n");
fputs("Hellon", p);
fputs("Worldn", p);
// 如果打开成功 , 则需要关闭文件
fclose(p);
}
printf("Main Endn");
return 0;
}
执行结果 :
如果文件不存在 , 则直接创建文件 , 并写出数据 ;
如果文件存在 , 则覆盖原来的文件 , 重新写入数据 ;
8、a
a : 以 追加方式 打开写文件 ,
- 如果文件不存在 , 则 创建文件 ;
- 如果文件存在 , 则新写入的数据会被 追加到文件末尾 , 文件原来的数据会被保留 ;
#include <stdio.h>
int main()
{
// 以 a 追加方式打开文件
// 如果文件不存在创建文件
// 如果文件存在, 则追加数据
FILE *p = fopen("D:\a.txt", "a");
if(p == NULL)
{
printf("File Open Failed !n");
}else
{
// 如果文件不存在创建文件
// 如果文件存在, 则追加数据
fputs("hellon", p);
// 如果打开成功 , 则需要关闭文件
fclose(p);
}
printf("Main Endn");
return 0;
}
该程序执行 2 2 2 次之后 , a.txt 文本中变成了两个 hello 文本 , 这是文件追加效果 ;
9、a
a : 以 追加方式 打开读写文件 ,
- 如果文件不存在 , 则 创建文件 ;
- 如果文件存在 , 则新写入的数据会被 追加到文件末尾 , 文件原来的数据会被保留 ;
该操作与 a 操作区别是可读 ;
三、文件打开方式总结
r : 只读方式打开文件 , 文件必须存在 ; 文件不存在打开失败 ;
: 读写方式打开文件 ;
w : 打开只写文件 , 文件不存在创建文件 , 文件存在覆盖文件 ;
a : 打开只写文件 , 文件不存在创建文件 , 文件存在追加文件 ;
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/158720.html原文链接:https://javaforall.cn