ARTICLE · 1161807
第二周学习文档 Linux C 文件操作
一 先用送外卖故事看懂
假设你是外卖店店员,桌上有一本订单本 orders.txt。C 程序就是店员,文件就是订单本。
fopen 把订单本拿出来并打开。
fprintf 把菜名和数量写进订单本。
fgets 一行一行地查看订单。
fclose 用完后合上订单本并放回去。
整个流程只有六步:
Open -> Write -> Close -> Reopen -> Read -> Close
二 本周需要达成的结果
1. 知道 FILE *fp 是程序和文件之间的联系。
2. 会用 r、w、a 三种模式打开文件。
3. 会写入、追加、逐行读取和关闭文件。
4. 会用 gcc 在 Ubuntu 中
5. 会交叉编译,并在 i.MX6ULL 开发板上运行。
本周时间预算
- 看懂故事和核心函数:约 1 小时。
- 跟着敲小练习:约 1.5 小时。
- 完成订单程序:约 1.5 小时。
- 交叉编译和开发板验证:约 1 小时。
总计约 5 小时,可以在一周内自由分配,不按天限制。
三 只需掌握的核心知识
1 FILE 指针
FILE *fp;
fp 可以理解为你手中的订单本把手。后面的读和写都要通过它找到文件。
2 fopen 打开文件
fp = fopen("orders.txt", "a");
orders.txt 是文件名,a 是打开方式。
3 r w a 三种模式
r read 只看以前的订单。文件不存在就失败。
w write 重新拿一本空订单本。原内容会被清空。
a append 翻到最后一页追加新订单。原内容保留。
记忆:r 是看,w 是重写,a 是追加。
停下来想一想
- 订单本已经有五条订单,想加第六条,应该选 w 还是 a?为什么?
- 如果只想看订单,应该用哪种模式?
4 写入文件
fputs("Order: noodles\n", fp);fprintf(fp, "Food: %s, Quantity:%d\n", food, quantity);
fputs 适合写固定文字;fprintf 适合把变量写进文件。
5 读取文件
while (fgets(text, sizeof(text), fp) != NULL){ printf("%s", text);}
fgets 每次读一行。while 让它继续读,直到文件末尾。
6 fclose 关闭文件
fclose(fp);
就像用完订单本要放回去。写完不关闭,数据可能没有完整保存。
7 打开失败必须处理
if (fp == NULL){ printf("File open failed.\n"); return 1;}
NULL 表示订单本没有成功打开。此时应停止程序,不能继续读写。
四 先做一个最小练习
这个练习完成四件事:创建文件、写入一行、重新打开、读出一行。
#include<stdio.h>intmain(void){FILE *fp;char text[100];fp = fopen("order.txt", "w");if (fp == NULL){printf("File open failed.\n");return 1;}fputs("Order: beef noodles\n", fp);fclose(fp);fp = fopen("order.txt", "r");if (fp == NULL){printf("File open failed.\n");return 1;}fgets(text, sizeof(text), fp);printf("%s", text);fclose(fp);return 0;}
Ubuntu 中运行
gcc file_basic.c -o file_basic./file_basiccat order.txt
预期看到:
Order: beef noodles
这个练习的重点
- 第一次 fopen 用 w,负责创建并写入。
- 写完先 fclose,再用 r 重新打开。
- fgets 读一行,printf 把这一行显示到终端。
不看代码回顾
- 为什么写完后要先 fclose,再用 r 重新打开?
- fgets 一次读多少内容?
- 如果 fopen 返回 NULL,程序还能继续读写吗?