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

相关推荐
左手の明天35 分钟前
SLIP 协议封装与解析详解:原理、C 代码与实战案例
linux·c语言·开发语言·c++
扶风ff37 分钟前
新品知识更新太快?用练题簿在线刷题,安排企业培训的小测与复盘
前端·学习·小程序
꯭自꯭闭꯭37 分钟前
达梦SQL优化相关
linux·运维·数据库·sql
一条破秋裤1 小时前
Linux 共享内存通信:POSIX 共享内存与 mmap
linux·运维·服务器
小灰灰搞电子2 小时前
C语言 <ctype.h> 头文件详解
c语言·ctype.h
阿钱真强道3 小时前
17 嵌入式操作系统 | uloop 事件循环:TCP 客户端
c语言·tcp/ip·tcp·事件循环·uloop
谷哥的小弟3 小时前
CentOS Stream浴火重生
linux·运维·centos
传奇开心果编程3 小时前
【SwiftUI提高练中学】第13课 实时活动与灵动岛:ActivityKit 实战
学习·ui·ios·swiftui·swift
欣欣之王来了3 小时前
Python入门:什么是Python以及为什么选择它
学习·架构·面向对象·项目·python教程
程序员-Benothing4 小时前
Shell输入输出详解:read、echo、printf、颜色输出
linux·运维·服务器