第二周学习文档 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>

int main(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_basic
cat order.txt

预期看到:

Order: beef noodles

这个练习的重点

  • 第一次 fopen 用 w,负责创建并写入。
  • 写完先 fclose,再用 r 重新打开。
  • fgets 读一行,printf 把这一行显示到终端。

不看代码回顾

  • 为什么写完后要先 fclose,再用 r 重新打开?
  • fgets 一次读多少内容?
  • 如果 fopen 返回 NULL,程序还能继续读写吗?
相关推荐
djjjx.1 小时前
Linux进程篇(三):深度硬核!全面起底 Linux 进程状态变化与内核链表动态解绑
linux·运维·服务器
乔旭伟1 小时前
Linux 服务器环境搭建实战笔记:最小化安装、Docker Compose 编排与上线检查全流程
linux·服务器·笔记
潜心一志1 小时前
图像预处理—— 图像的变换与校正(理论)
学习·计算机视觉
nmjkhome1 小时前
26 疲劳的几个重要概念(第51课)-solid works simulation
学习
程序猿乐锅2 小时前
【从0-1学习Python | 第六篇】 Python 函数:定义、参数与返回值
开发语言·python·学习
燕落南枝2 小时前
HTML 学习:input 单选、复选与文件域详解
服务器·学习·html
Bluetooth7302 小时前
c语言变量的存储类别
c语言
lhbweilai7 小时前
分析FreeRTOS内核对象API的源码实现(四)
c语言·stm32·单片机
Chenyu_31010 小时前
DPDK、TC 和 XDP:Linux 高性能网络到底在优化什么
linux·服务器·网络·缓存