Linux文件系统精要
7类文件类型
b | 块设备文件 | 硬盘(/dev/sda) |
c | 字符设备文件 | 键盘/显示器(/dev/tty) |
d | 目录文件 | 文件夹(/home) |
– | 普通文件 | .c/.txt/.jpg/a.out |
l | 软链接文件 | 快捷方式(符号链接) |
s | 套接字文件 | 网络通信接口 |
p | 管道文件 | 进程间通信(FIFO) |
文件属性解析
drwxrwxr-x 2 linux linux 4096 Jan 29 2024 mydir/
↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑
│ │ │ │ │ │ │ └── 文件名
│ │ │ │ │ │ └── 修改时间
│ │ │ │ │ └── 文件大小(字节)
│ │ │ │ └── 所属组
│ │ │ └── 所属用户
│ │ └── 硬链接数
│ └── 操作权限(9位分3组)
└── 文件类型
权限分组:
- 用户权限(rwx):文件所有者
- 组权限(rwx):同组用户
- 其他权限(r-x):其他用户
文件操作核心方法论
打开文件:获取访问句柄
读写操作:数据交互
关闭文件:释放资源
文件操作双体系
标准IO | C标准库 | 带缓冲,高效 | 库函数 |
文件IO | Linux内核 | 无缓冲,实时 | 系统调用 |
标准IO库函数实战
文件流(FILE指针)
本质:字节流抽象(数据进出文件的通道)
标识:FILE* 类型指针
关键函数操作
打开文件 | FILE* fopen(path, mode) | path:路径 mode:打开模式 | 成功:FILE* 失败:NULL |
写入字符 | int fputc(int c, FILE* stream) | c:字符 stream:文件流 | 成功:c 失败:EOF |
读取字符 | int fgetc(FILE* stream) | stream:文件流 | 成功:ASCII值 失败/EOF:-1 |
关闭文件 | int fclose(FILE* stream) | stream:文件流 | 成功:0 失败:EOF |
文件打开模式
r | 只读 | 正常打开 | 打开失败 |
r+ | 读写 | 正常打开 | 打开失败 |
w | 只写 | 清空内容 | 创建新文件 |
w+ | 读写 | 清空内容 | 创建新文件 |
a | 追加写(尾部写入) | 保留内容 | 创建新文件 |
a+ | 读写(可读可追加) | 保留内容 | 创建新文件 |
关键注意事项
sizeof vs strlen:
char buf[100] = "hello";
sizeof(buf); // 100(内存占用)
strlen(buf); // 5(遇'\\0'停止)
fputs特性:写入字符串时不包含结尾'\\0'
关键技巧总结
文件打开安全规范:
FILE *fp = fopen("data.txt", "r");
if (fp == NULL)
{
perror("fopen failed");
return -1;
}
EOF处理技巧:
int ch;
while ((ch = fgetc(fp)) != EOF)
{
putchar(ch);
}
代码
opon.c
#include <stdio.h>
int main(int argc, const char *argv[])
{
FILE *fp = fopen("./1.txt", "w");
if(NULL == fp)
{
printf("oppen error\\n");
return -1;
}
printf("oppen ok\\n");
return 0;
}
read.c
#include <stdio.h>
int main(void)
{
FILE *fp = fopen("./2.txt", "r");
if(NULL == fp)
{
printf("oppen error\\n");
return -1;
}
printf("oppen ok\\n");
int ret ;
while(ret != EOF)
{
ret = fgetc(fp);
if(EOF == ret)
{
puts("");
return -1;
}
printf("%c", ret);
}
return 0;
}
write.c
#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[])
{
FILE *fp = fopen("./1.txt", "w");
if(NULL == fp)
{
printf("oppen error\\n");
return -1;
}
printf("oppen ok\\n");
char s[100] = "hello world";
int i;
for(i = 0;i < strlen(s); ++i)
{
fputc(s[i], fp);
}
fclose(fp);
return 0;
}
copy.c
#include <stdio.h>
int main(int argc, const char *argv[])
{
if(argc != 3)
{
printf("Usage : ./a.out <srcfile> <destfile>\\n");
return -1;
}
FILE *srcfp = fopen(argv[1], "r");
FILE *dstfp = fopen(argv[2], "w");
if(NULL == srcfp || NULL == dstfp)
{
printf("fopen error\\n");
return -1;
}
while(1)
{
int ret = fgetc(srcfp);
if(EOF == ret)
{
break;;
}
fputc(ret, dstfp);
}
fclose(srcfp);
fclose(dstfp);
return 0;
}
fgets.c
#include <stdio.h>
int main(int argc, const char *argv[])
{
FILE *fp = fopen("1.txt", "r");
if (NULL == fp)
{
printf("fopen error\\n");
return -1;
}
char s[100] = {0};
char *p = fgets(s, sizeof(s), fp);
if (NULL == p)
{
printf("error or end of file\\n");
}
printf("s = %s\\n", s);
fclose(fp);
return 0;
}
fputs
#include <stdio.h>
int main(int argc, const char *argv[])
{
FILE *fp = fopen("1.txt", "w");
if (NULL == fp)
{
printf("fopen error\\n");
return -1;
}
fputs("hello world", fp);
char str[32] = {"how are you"};
fputs(str, fp);
char *pstr = "hello world";
fputs(pstr, fp);
fclose(fp);
return 0;
}
fgetsCat
#include <stdio.h>
int main(int argc, const char *argv[])
{
if(argc != 2)
{
printf("error\\n");
return -1;
}
FILE *fsrc = fopen(argv[1], "r");
if(NULL == fsrc)
{
printf("oppen error\\n");
return -1;
}
char s[100];
char *save = NULL;
while(1)
{
save = fgets(s, sizeof(s), fsrc);
if(NULL == save)
{
break;
}
puts(save);
}
fclose(fsrc);
return 0;
}
fgetsFputsCopy
#include <stdio.h>
int main(int argc, char *argv[])
{
if(argc != 3)
{
printf("error\\n");
return -1;
}
FILE *fsrc = fopen(argv[1], "r");
FILE *fdest = fopen(argv[2], "w");
if(NULL == fsrc || NULL == fdest)
{
printf("open error\\n");
return -1;
}
char s[100];
char *save = NULL;
while(1)
{
save = fgets(s, sizeof(s), fsrc);
if(NULL == save)
{
break;
}
int t = fputs(save, fdest);
if(EOF == t)
{
break;
}
}
fclose(fsrc);
fclose(fdest);
return 0;
}
总结
文件类型本质:
- 一切皆文件 → 统一操作接口
- 权限三元组 → 用户/组/其他权限分离
标准IO核心优势:
- 缓冲机制减少系统调用(性能提升)
- 跨平台兼容性(POSIX标准)
嵌入式场景适配:
- 日志文件优先用a模式(防意外覆盖)
- 配置文件读取用r模式(安全只读)
- 临时文件使用后立即删除
评论前必须登录!
注册