在C语言中,文件使用方式(文件打开模式)中的加号 + 表示 可读可写(读写模式)。
主要文件打开模式:
基本模式:
· "r" - 只读(文件必须存在)
· "w" - 只写(创建新文件,如果存在则清空)
· "a" - 追加(在文件末尾写入)
带 + 号的读写模式:
· "r+" - 读写(文件必须存在)
· "w+" - 读写(创建新文件,如果存在则清空)
· "a+" - 读写追加(可读,写操作在文件末尾)
- 号的具体意义:
- 功能扩展
FILE *fp1 = fopen("file.txt", "r"); // 只能读
FILE *fp2 = fopen("file.txt", "r+"); // 既能读又能写
- 不同模式的特性:
"r+" 模式:
· 文件必须存在
· 可读取任意位置
· 可写入任意位置(会覆盖原有内容)
· 文件指针可通过 fseek() 移动
FILE *fp = fopen("test.txt", "r+");
if (fp) {
fputs("Hello", fp); // 写入(覆盖开头的内容)
fseek(fp, 0, SEEK_SET); // 回到文件开头
char buffer[100];
fgets(buffer, 100, fp); // 读取刚才写入的内容
fclose(fp);
}
"w+"" 模式:
· 如果文件存在,清空内容
· 如果文件不存在,创建新文件
· 可读可写
FILE *fp = fopen("test.txt", "w+"); // 清空文件内容
fputs("New content", fp); // 写入
rewind(fp); // 回到开头
// 可以读取刚刚写入的内容
"a+" 模式:
· 写操作总是在文件末尾(追加)
· 读操作可以从任意位置
· 文件指针移动对读有效,但对写无效(写总是追加)
FILE *fp = fopen("test.txt", "a+");
fputs("Appended text", fp); // 总是添加到文件末尾
fseek(fp, 0, SEEK_SET); // 可以移动到开头读取
// 但再执行写操作时,又会自动跳到末尾
注意事项:
- 读写切换时需要定位:
FILE *fp = fopen("file.txt", "r+");
// 先写后读
fputs("Hello", fp);
fseek(fp, 0, SEEK_SET); // 必须重新定位!
char ch = fgetc(fp); // 现在可以读取
// 先读后写
fgetc(fp);
fseek(fp, 0, SEEK_CUR); // 读写切换需要fseek
fputc('X', fp);
- 二进制文件的 + 模式:
"rb+" // 二进制读写(文件必须存在)
"wb+" // 二进制读写(创建/清空文件)
"ab+" // 二进制追加读写
使用场景示例:
// 1. 修改文件中的部分内容
FILE *fp = fopen("data.dat", "r+b");
fseek(fp, 10, SEEK_SET); // 跳到第10字节
fwrite(&new_data, sizeof(int), 1, fp); // 修改该位置的数据
// 2. 读取并处理日志文件
FILE *log = fopen("app.log", "a+");
// 可以读取历史日志进行分析
// 同时可以追加新的日志记录
总结:+ 号让文件操作更加灵活,可以在同一个文件流上执行读写操作,特别适合需要修改文件内容或同时进行读写处理的场景。