Linux 文件编程入门

一、什么是文件编程?

在 Linux 系统中,一切皆文件:普通文本、图片、设备、套接字、甚至键盘和鼠标等都被抽象为文件。

文件编程就是通过程序对这些“文件”进行操作(如打开、读取、写入、关闭等),实现数据的存储与交互。


┌────────────────────────────┐
│       用户空间应用程序                                    │
│  (如:使用 fopen、read 等)                           │
└────────────┬───────────────┘

             ▼
┌────────────────────────────┐
│        C 标准库函数                                          │
│  (如:fopen、fread、fwrite)                         │
└────────────┬───────────────┘
             │
             ▼
┌────────────────────────────┐
│        系统调用接口                                          │
│  (如:open、read、write)                            │
└────────────┬───────────────┘
             │
             ▼
┌────────────────────────────┐
│        虚拟文件系统 VFS                                   │
│  (统一的文件系统接口层)                                │
└────────────┬───────────────┘
             │
             ▼
┌────────────────────────────┐
│        实际文件系统层                                       │
│  (如:ext4、XFS、Btrfs 等)                          │
└────────────┬───────────────┘
             │
             ▼
┌────────────────────────────┐
│        存储设备驱动层                                       │
│  (与硬盘、SSD 等设备交互)                           │
└────────────────────────────┘

  • 用户空间应用程序:​编写的 C 程序,通过调用标准库函数进行文件操作。

  • C 标准库函数:​如 fopenfreadfwrite 等,这些函数封装了底层的系统调用,提供更易用的接口。

  • 系统调用接口:​如 openreadwrite 等,直接与内核交互,执行实际的文件操作。

  • 虚拟文件系统 VFS:​内核中的一个抽象层,提供统一的接口,使不同的文件系统(如 ext4、XFS)可以被统一管理。

  • 实际文件系统层:​具体的文件系统实现,负责将文件操作映射到存储设备上的实际数据读写。

  • 存储设备驱动层:​与物理存储设备(如硬盘、SSD)进行通信,完成最终的数据读写操作。

在 Linux 系统中,文件编程的整个流程从用户空间的应用程序开始。首先,程序通过调用标准库函数(如 fopenfreadfwrite 等)来请求文件操作。标准库函数会将这些请求传递到系统调用接口,操作系统内核根据这些请求进行相应的文件系统操作。接下来,内核通过虚拟文件系统(VFS)来抽象和统一不同文件系统(如 ext4、XFS 等),确保应用程序不需要关心底层文件系统的实现。

在 VFS 层,文件操作请求会被转换为特定文件系统的操作,并通过存储设备驱动层与硬盘、SSD 等物理设备进行交互。此时,文件的数据会被实际读写到硬盘上,完成文件的存储或读取。

总结来说,文件编程的流程从用户空间的应用程序发起,通过标准库函数、系统调用、虚拟文件系统,最终与物理存储设备进行交互,完成数据的存取操作。这个过程涉及多个层次的抽象和接口,每一层都在处理不同的任务,确保文件操作的高效和可靠。

二、常见的文件类型

文件类型示例说明
普通文件.txt, .c存储文本或二进制数据
目录文件/home/user/用于存储文件和目录
设备文件/dev/sda, /dev/null与硬件设备通信
管道/套接字/proc/, /tmp/sock用于进程间通信

三、文件编程的两种方式

  1. 标准 I/O 函数(stdio.h)
    高级封装,使用简单,适合文本处理。
    常用函数:fopen()fclose()fread()fwrite()fprintf()fscanf() 等。

  2. 系统调用(unistd.h / fcntl.h)
    低级接口,直接与内核交互,适合对性能要求高的场景。
    常用函数:open()read()write()close()lseek()


四、使用标准 I/O 读写文件(推荐新手使用)

示例1:写入文本到文件中

#include <stdio.h>

int main() {
    FILE *fp = fopen("hello.txt", "w");  // 打开文件,模式为写

    if (fp == NULL) {
        perror("打开文件失败");
        return 1;
    }

    fprintf(fp, "你好,世界!\n这是我的第一个文件编程。\n");
    fclose(fp);  // 关闭文件

    return 0;
}

示例2:从文件中读取内容

#include <stdio.h>

int main() {
    char buffer[100];
    FILE *fp = fopen("hello.txt", "r");  // 以只读模式打开

    if (fp == NULL) {
        perror("无法打开文件");
        return 1;
    }

    while (fgets(buffer, sizeof(buffer), fp)) {
        printf("%s", buffer);  // 打印每一行
    }

    fclose(fp);
    return 0;
}

五、使用系统调用方式打开和写入文件

更底层的操作,适用于系统开发或性能要求高的程序。

示例3:使用 open()write() 写入文件

#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

int main() {
    int fd = open("data.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);  // 打开文件

    if (fd < 0) {
        perror("打开文件失败");
        return 1;
    }

    const char *text = "Hello, Linux file programming!\n";
    write(fd, text, 32);  // 写入数据
    close(fd);            // 关闭文件

    return 0;
}

六、文件打开模式(标准 I/O)

模式含义
"r"只读,文件必须存在
"w"只写,若文件存在则清空
"a"追加写入,文件不存在则创建
"r+"读写,文件必须存在
"w+"读写,若文件存在则清空
"a+"读写,追加模式

七、编译与运行

将代码保存为 file_demo.c,使用如下命令编译运行:

gcc file_demo.c -o file_demo
./file_demo

运行成功后,会在当前目录生成或读取指定的文本文件。

八、注意事项与常见问题

  • 打开文件失败时,fopen()open() 返回 NULL-1,应立即处理错误;

  • 文件使用完后一定要关闭(fclose()close()),否则数据可能不会立即写入;

  • write()fwrite() 并不自动在末尾添加 \0,要手动处理字符串结束;

  • 读取二进制文件时不要用 %sfgets(),应使用 fread()


九、延伸阅读

  • 二进制文件的读写

  • lseek() 文件指针控制

  • 文件权限与访问控制(chmod, umask

  • 临时文件的创建:tmpfile()mkstemp()

如果你是 Linux C 编程的新手,从文件编程开始是非常好的入门途径。掌握这些内容,你就可以编写日志系统、配置解析器、数据存储模块等更高级的程序了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hardStudy_h

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值