云计算百科
云计算领域专业知识百科平台

《嵌入式Linux应用编程(一):Linux文件操作精要与标准IO实战》

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模式(安全只读)
  • 临时文件使用后立即删除
赞(0)
未经允许不得转载:网硕互联帮助中心 » 《嵌入式Linux应用编程(一):Linux文件操作精要与标准IO实战》
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!