嵌入式学习 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很像,理解起来基本不费力。打开文件时一定要进行错误检查,并且要在最后关闭文件,不然可能会造成数据丢失。

相关推荐
hsjiasb1 小时前
FreeRTOS学习(三十五)——系统架构综合项目
学习·学习笔记·freertos
Arnold.Shen1 小时前
Dell Storage SC - 如何发送SupportAssist,并启用安全控制台
linux·安全
wunaiqiezixin1 小时前
MIT 6.S081 xv6 源码精读(Scheduling):sched、scheduler
linux·unix·os·xv6·mit6.s081
YM52e1 小时前
语言地区选择器-鸿蒙ArkTS国际化页面设计
学习·华为·harmonyos
不是光头 强2 小时前
Java 后端 AI 技术选型与学习路线
java·人工智能·学习
cloudification2 小时前
virtual
学习
书生执笔画浮沉2 小时前
记录一个由浮点运算引起的崩溃
linux
MartinYeung52 小时前
[论文学习]δ-STEAL:基于本地差分隐私的大语言模型窃取攻击
网络·学习·语言模型
paopaokaka_luck2 小时前
基于springboot3+vue3的文山民族文化资源展示与推广平台(协同过滤算法、Echarts 图形化分析)
java·前端·spring boot·学习·echarts