夜雨聆风学习资料网

ARTICLE · 1161807

第二周学习文档 Linux C 文件操作

第二周学习文档 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,程序还能继续读写吗?

相关学习资料