文章目录
- 🗂️前言
- 📄ref
- 📄访问标记
- 🗃️文件访问标记
- 🗂️Code
- 📄demo
- 📄分点讲解
- 🗃️打开/关闭
- 🗃️写
- 🗃️读
- 🗂️END
- 🌟关注我
🗂️前言
📄ref
- 文件输入/输出 - cppreference.com
- fopen, fopen_s - cppreference.com
📄访问标记
🗃️文件访问标记
文件访问 模式字符串 | 含义 | 解释 | 若文件已存在的动作 | 若文件不存在的动作 |
---|---|---|---|---|
“r” | 读 | 打开文件以读取 | 从头读 | 打开失败 |
“w” | 写 | 创建文件以写入 | 销毁内容 | 创建新文件 |
“a” | 后附 | 后附到文件 | 写到结尾 | 创建新文件 |
“r+” | 读扩展 | 打开文件以读/写 | 从头读 | 错误 |
“w+” | 写扩展 | 创建文件以读/写 | 销毁内容 | 创建新文件 |
“a+” | 后附扩展 | 打开文件以读/写 | 写到结尾 | 创建新文件 |
- 可以可选地指定文件访问模式标记 “b” 来以二进制模式打开文件。此标在 POSIX 上没有效果,而在 Windows 系统上,它禁用了对 ‘\n’ 和 ‘\x1A’ 特殊处理。 在附加文件访问模式下,数据被写入到文件尾,而不考虑文件位置指示器的当前位置。
- 如果模式不是以上所列字符串之一,则其行为未定义。一些实现会定义额外支持的模式(比如 Windows)。
- 在更新模式(
'+'
)中,输入和输出均可进行,然而输出不应直接紧随输入,而中间无对 fflush、fseek、fsetpos 或 rewind 的调用,且输入不应直接紧随输出,而中间无对 fseek、fsetpos 或 rewind 的调用,除非输入操作遇到文件尾。在更新模式中,允许各实现在即便指定了文本模式时仍使用二进制模式。- 文件访问模式标记 “x” 可以可选地后附于 “w” 或 “w+” 指定符。若文件存在,则此标记强制函数失败,而不重写它。(C11)
- 使用 fopen_s 或 freopen_s 时,任何以 “w” 或 “a” 创建的文件的文件访问许可均禁止其他用户访问它。文件访问模式标签
"u"
可以可选地前附于任何以 “w” 或 “a” 开始的指定符,以启用默认的 fopen 许可。(C11)
🗂️Code
📄demo
#include <stdio.h>
#include <stdlib.h>void file_write(const char* file_path) {FILE* fp = fopen(file_path, "w+");if (NULL == fp) {return;}fputs("cuber-lotus", fp);fputc('\n', fp);fputc('u', fp);fputc('r', fp);fputc('l', fp);fputc(':', fp);fprintf(fp, "https://space.bilibili.com/8172252");if (ferror(fp)) {perror("Error I/O.");}fclose(fp);
}void file_read(const char* file_path) {FILE* fp = fopen(file_path, "r+");if (NULL == fp) {return;}#if 1// 按行读char buf[1024] = {};while (feof(fp) == 0) {fgets(buf, sizeof(buf), fp);printf("%s", buf);}
#else// 按字符读int c;while ((c = fgetc(fp)) != EOF) {putchar(c);}
#endifputs("");if (ferror(fp)) {perror("Error I/O.");} else if (feof(fp)) {puts("fp is EOF.");} else {puts("fp is not EOF.");}fclose(fp);
}int main() {const char* file_path = "example.txt";file_write(file_path);file_read(file_path);
}
📄分点讲解
注意,所有操作都有多种api,比如关于print
组函数可见:(C语言) print输出函数系列介绍
其实文件就是一种特殊的流
,如果对流的概念和操作熟悉,那么对文件的读写想必也会很很难。
🗃️打开/关闭
注意:千万必要复制FILE
对象,该行为是未定义的。
FILE* fp = fopen(file_path, "w+");
fclose(fp);
🗃️写
// 写入char*
fputs("cuber-lotus", fp);
// 写入单个字符
fputc(':', fp);
// 写入char*
fprintf(fp, "https://space.bilibili.com/8172252");
🗃️读
法1:
// 按行读
char buf[1024] = {};
while (feof(fp) == 0) {fgets(buf, sizeof(buf), fp);printf("%s", buf);
}
法2:
// 按字符读
int c;
while ((c = fgetc(fp)) != EOF) {putchar(c);
}
🗂️END
🌟关注我
关注我,学习更多C/C++,算法,计算机知识
B站:
👨💻主页:天赐细莲 bilibili