嵌入式学习 day27:标准IO

一、文件操作的基本步骤

在C语言中操作文件,永远是三步:

c

复制代码
1. 打开文件   → fopen()
2. 读写文件   → fputc() / fgetc() / fputs() / fgets() / fprintf() / fscanf() / fwrite() / fread()
3. 关闭文件   → fclose()

注意:打开的文件一定要记得关闭,否则可能造成资源泄露或数据丢失。

二、文件的两种类型

类型 特点 举例
ASCII码文件(文本文件) 每个字符都能在终端显示 .c、.txt、.h
二进制文件 存在不可显示的字符 图片、音视频、压缩包

三、fopen :打开文件

c

复制代码
FILE *fopen(const char *pathname, const char *mode);

mode(打开方式)

模式 含义 文件不存在 文件存在
r 只读 报错 只读打开
r+ 读写 报错 读写打开
w 只写 创建 清空后只写打开
w+ 写读 创建 清空后写读打开
a 追加只写 创建 追加只写打开
a+ 追加读写 创建 追加读写打开

c

复制代码
FILE *fp = fopen("test.txt", "r");
if (fp == NULL) {
    perror("fopen");
    return -1;
}

四、标准IO的缓存机制

标准IO是有缓存的,数据不会立即写入文件,而是先存在缓冲区里,满足条件时才真正写入。

缓存类型 大小 刷新条件 关联对象
全缓存 4K(4096字节) 缓存区满、强制flush、程序结束/fclose 普通文件
行缓存 1K(1024字节) 缓存区满、遇到 \n、强制flush、程序结束/fclose 终端(stdout)
不缓存 0 立即刷新 stderr

五、单个字符读写

5.1 fputc:写入一个字符

c

复制代码
int fputc(int c, FILE *stream);

功能:将一个字符写入到指定的流中。

参数c 是要写入的字符(用ASCII码值表示),stream 是文件流指针。

返回值 :成功返回写入字符的ASCII码值,失败返回 EOF(-1)。

c

复制代码
FILE *fp = fopen("test.txt", "w");
fputc('A', fp);      // 写入字符 A
fputc('\n', fp);     // 写入换行
fclose(fp);

5.2 fgetc: 读取一个字符

c

复制代码
int fgetc(FILE *stream);

功能:从指定的流中读取一个字符。

返回值 :成功返回读取到的字符的ASCII码值,失败或读到文件末尾返回 EOF(-1)。

c

复制代码
FILE *fp = fopen("test.txt", "r");
int ch;
while ((ch = fgetc(fp)) != EOF) {
    putchar(ch);     // 逐个打印字符
}
fclose(fp);

六、其他读写函数

字符串读写

  • fputs(str, fp):向文件写入字符串

  • fgets(buf, size, fp):从文件读取字符串(会保留换行符)

格式化读写

  • fprintf(fp, "format", ...):格式化写入文件

  • fscanf(fp, "format", ...):从文件格式化读取

二进制读写

  • fwrite(ptr, size, nmemb, fp):写入二进制数据

  • fread(ptr, size, nmemb, fp):读取二进制数据(打开方式要加 b,如 "rb""wb"

三个默认流

  • stdin:标准输入流

  • stdout:标准输出流

  • stderr:标准错误流

printf 本质上是 fprintf(stdout, ...)scanf 本质上是 fscanf(stdin, ...)

七、今日总结

今天学了标准IO,核心要点如下:

  1. 文件操作三步走:打开(fopen)→ 读写 → 关闭(fclose)

  2. 打开方式r(读)、w(写)、a(追加),加 + 表示读写,加 b 表示二进制

  3. 缓存机制:全缓存(普通文件)、行缓存(终端)、不缓存(stderr)

  4. 字符读写:fputc 写入单个字符,fgetc 读取单个字符,配合循环可遍历整个文件

  5. 其他读写:字符串(fputs/fgets)、格式化(fprintf/fscanf)、二进制(fwrite/fread)

  6. 三个默认流:stdin、stdout、stderr

今日感悟

文件操作和printf/scanf很像,理解起来基本不费力。打开文件时一定要进行错误检查,并且要在最后关闭文件,不然可能会造成数据丢失。

相关推荐
Mr-Apple9 小时前
系统找不到指定的文件-CreateInstance/CreateVm/HCS/ERROR_FILE_NOT_FOUND
linux·windows·ubuntu·wsl
布裘9 小时前
【银河麒麟】服务器系统开机黑屏故障排查与修复
linux·运维·服务器·银河麒麟·无法启动
Zenova EdgeOS10 小时前
Linux iotop:工业边缘 I/O 高级分析实战
linux·运维·服务器
番茄灭世神10 小时前
汇顶模拟前端GH3220使用备忘录
c语言·单片机·传感器·模拟芯片·电生理信号处理
新兴AI民工10 小时前
【Linux内核三十九】进程管理模块:CFS负载均衡(四):find_busiest_group决策矩阵与calculate_imbalance
linux
LongRunning10 小时前
【linux】RK3568(五)云服务器-视频推流
linux
GIS好难学10 小时前
想转GIS开发,企业会卡专业背景吗?
学习·gis·gis开发·webgis
赵民勇10 小时前
resolvectl命令详解
linux·运维
新时代牛马10 小时前
Linux 日志管理:journald、rsyslog 与 logrotate
linux·运维·服务器
老猿讲编程10 小时前
【Eclipse OpenSOVD学习之十四】差距清单与演进建议
学习·rust·eclipse·车载·sovd