当前位置: 首页 > news >正文

Linux文件操作笔记

一、核心概念
  1. 文件描述符

    • 系统用于唯一标识文件的整数值,如0(标准输入)、1(标准输出)、2(标准错误)。
    • 可通过/proc/sys/fs/file-max查看系统支持的最大文件描述符数量。
  2. 文件类型与权限

    • 类型:普通文件(-)、目录(d)、链接(l)、字符设备(c)、块设备(b)等。
    • 权限r(读)、w(写)、x(执行),分为用户、组、其他三类权限。
  3. 操作方式对比

    特性系统调用(低级IO)标准IO(高级IO)
    效率直接操作硬件,高效带缓冲区,减少系统调用次数
    跨平台性依赖操作系统跨平台(如fopen
    函数示例open, read, writefopen, fread, fwrite
    适用场景需要精细控制(如设备文件)常规文件读写

二、系统调用(System IO)
1. 常用函数
#include <fcntl.h>
#include <unistd.h>

int open(const char *path, int flags, mode_t mode); // 打开文件
ssize_t read(int fd, void *buf, size_t count);      // 读取文件
ssize_t write(int fd, const void *buf, size_t count);// 写入文件
int close(int fd);                                   // 关闭文件
off_t lseek(int fd, off_t offset, int whence);       // 移动文件指针
2. 示例:读取文件内容并统计字节数
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

int main() {
    int fd = open("test.txt", O_RDONLY);
    if (fd == -1) {
        perror("文件打开失败");
        return 1;
    }

    char buf[1024];
    ssize_t bytes_read;
    int total = 0;

    while ((bytes_read = read(fd, buf, sizeof(buf))) > 0) {
        total += bytes_read;
    }

    printf("文件总字节数: %d\n", total);
    close(fd);
    return 0;
}

输出

文件总字节数: 1024(假设文件内容为1KB)

三、标准IO(标准库函数)
1. 常用函数
#include <stdio.h>

FILE *fopen(const char *filename, const char *mode); // 打开文件
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); // 读取
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream); // 写入
int fclose(FILE *stream);                             // 关闭文件
int fseek(FILE *stream, long offset, int whence);     // 移动文件指针
2. 示例:复制文件内容
#include <stdio.h>

int main() {
    FILE *src = fopen("source.txt", "rb");
    FILE *dest = fopen("dest.txt", "wb");
    if (!src || !dest) {
        perror("文件打开失败");
        return 1;
    }

    char buffer[1024];
    size_t bytes;
    while ((bytes = fread(buffer, 1, sizeof(buffer), src)) {
        fwrite(buffer, 1, bytes, dest);
    }

    fclose(src);
    fclose(dest);
    printf("文件复制成功\n");
    return 0;
}

输出

文件复制成功

四、文件属性操作
1. 获取文件信息(stat结构体)
#include <sys/stat.h>

struct stat file_info;
stat("test.txt", &file_info);
printf("文件大小: %ld 字节\n", file_info.st_size);
printf("文件类型: %s\n", S_ISREG(file_info.st_mode) ? "普通文件" : "其他");
2. 示例:检查文件权限
#include <sys/stat.h>
#include <stdio.h>

int main() {
    struct stat st;
    if (stat("test.txt", &st) == -1) {
        perror("stat失败");
        return 1;
    }

    printf("用户权限: %c%c%c\n",
           (st.st_mode & S_IRUSR) ? 'r' : '-',
           (st.st_mode & S_IWUSR) ? 'w' : '-',
           (st.st_mode & S_IXUSR) ? 'x' : '-');
    return 0;
}

输出(假设文件权限为rw-):

用户权限: rw-

五、综合例题

题目:使用系统调用实现文件内容反转(如将abc变为cba)。

#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>

int main() {
    int fd = open("input.txt", O_RDWR);
    if (fd == -1) {
        perror("打开文件失败");
        return 1;
    }

    struct stat st;
    fstat(fd, &st);
    off_t size = st.st_size;

    char buf1, buf2;
    for (off_t i = 0; i < size / 2; i++) {
        lseek(fd, i, SEEK_SET);
        read(fd, &buf1, 1);
        lseek(fd, size - 1 - i, SEEK_SET);
        read(fd, &buf2, 1);

        lseek(fd, i, SEEK_SET);
        write(fd, &buf2, 1);
        lseek(fd, size - 1 - i, SEEK_SET);
        write(fd, &buf1, 1);
    }

    close(fd);
    printf("文件内容已反转\n");
    return 0;
}

输出

文件内容已反转

总结

  1. 系统调用:适合需要直接控制文件或设备(如串口)的场景,但需手动管理缓冲区。
  2. 标准IO:适合常规文件操作,提供缓冲机制,提升效率,代码更简洁。
  3. 关键点
    • 文件操作后必须关闭,避免资源泄漏。
    • 错误处理(如检查openfopen的返回值)。
    • 理解文件指针和偏移量的操作(lseekfseek)。

通过结合系统调用和标准IO的优势,可以灵活应对不同场景下的文件操作需求。

相关文章:

  • 手撕算法之`vector` 扩容、`string` 分割、链表翻转
  • 头歌实训--Pandas合并数据集--第1关:Concat与Append操作
  • vue使用element-ui自定义样式思路分享【实操】
  • freeswitch(在呼叫失败的情况下如何播放语⾳提⽰)
  • 【音视频开发】第三章 FFmpeg 命令实战
  • Java遍历魔法
  • 嵌入式笔记 | 正点原子STM32F103ZET6 3 | 时钟系统
  • 【MySQL】基本查询(第一弹)
  • P10045 [CCPC 2023 北京市赛] 线段树
  • docker部署dify
  • VNA操作使用学习-14 再测晶振特性
  • 发布第四代液晶电视,TCL引领全新美学境界
  • 理解 RAG 第四部分:RAGA 和其他评估框架
  • Android BLE 权限管理
  • 城市街拍人像自拍电影风格Lr调色教程,手机滤镜PS+Lightroom预设下载!
  • 内网渗透(CSMSF) 构建内网代理的全面指南:Cobalt Strike 与 Metasploit Framework 深度解析
  • latex-二项式括号怎么敲?
  • Linux --centos安装显卡驱动
  • 【AI】AI编程助手:Cursor、Codeium、GitHub Copilot、Roo Cline、Tabnine
  • 零拷贝技术深度解析:原理、实现与性能革命
  • 车载抬头显示爆发在即?业内:凭借市场和产业链优势,国内供应商实现反超
  • 中国海警舰艇编队5月14日在我钓鱼岛领海巡航
  • 横跨万里穿越百年,《受到召唤·敦煌》中张艺兴一人分饰两角
  • 中巴续签双边本币互换协议,进一步深化金融战略合作
  • 字母哥动了离开的心思,他和雄鹿队的缘分早就到了头
  • 新闻1+1丨婚姻登记服务,如何跑出幸福加速度?