欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 美食 > Linux文件操作笔记

Linux文件操作笔记

2025/3/26 23:45:02 来源:https://blog.csdn.net/qq_19406475/article/details/146400127  浏览:    关键词: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的优势,可以灵活应对不同场景下的文件操作需求。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词