【Linux学习笔记】基础IO之理解文件

🔥个人主页 :大白的编程日记
🔥专栏:Linux学习笔记
前言
哈喽,各位小伙伴大家好!上期我们讲了进程替换 今天我们讲的是基础IO之理解文件。话不多说,我们进入正题!向大厂冲锋!
1.理解"文件"
1-1狭义理解
- 文件在磁盘里
- 磁盘是永久性存储介质,因此文件在磁盘上的存储是永久性的
- 磁盘是外设(即是输出设备也是输入设备)
- 磁盘上的文件本质是对文件的所有操作,都是对外设的输入和输出简称
IO
1-2广义理解
·Linux下一切皆文件(键盘、显示器、网卡、磁盘···...·这些都是抽象化的过程)(后面会讲如何去理解)
1-3文件操作的归类认知
- 对于OKB的空文件是占用磁盘空间的
- 文件是文件属性(元数据)和文件内容的集合(文件=属性(元数据)+内容)
- 所有的文件操作本质是文件内容操作和文件属性操作
1-4系统角度
对文件的操作本质是进程对文件的操作
磁盘的管理者是操作系统
文件的读写本质不是通过C语言/C++的库函数来操作的(这些库函数只是为用户提供方便),而是通过文件相关的系统调用接口来实现的
2.回顾C文件接口
2-1 hello.c打开文件
cpp
#include <stdio.h>
int main()
{
FILE *fp = fopen("myfile", "w");
if(!fp){
printf("fopen error!\n");
}
while(1);
fclose(fp);
return 0;
}
打开的myfile文件在哪个路径下?
- 在程序的当前路径下,那系统怎么知道程序的当前路径在哪里呢?
可以使用ls/proc/[进程id] -l
命令查看当前正在运行进程的信息:
bash
[hyb@VM-8-12-centos io]$ ps ajx | grep myProc
506729 533463 533463 506729 pts/249 533463 R+ 1002 7:45 ./myProc
536281 536542 536541 536281 pts/250 536541 R+ 1002 0:00 grep --
color=auto myProc
[hyb@VM-8-12-centos io]$ ls /proc/533463 -l
total 0
......
-r--r--r-- 1 hyb hyb 0 Aug 26 17:01 cpuset
lrwxrwxrwx 1 hyb hyb 0 Aug 26 16:53 cwd -> /home/hyb/io
-r--r--r-- 1 hyb hyb 0 Aug 26 17:01 environ
lrwxrwxrwx 1 hyb hyb 0 Aug 26 16:53 exe -> /home/hyb/io/myProc
dr-x------ 2 hyb hyb 0 Aug 26 16:54 fd
......
其中:
cwd
:指向当前进程运行目录的一个符号链接。exe
:指向启动当前进程的可执行文件(完整路径)的符号链接。
打开文件,本质是进程打开,所以,进程知道自己在哪里,即便文件不带路径,进程也知道。由此OS就能知道要创建的文件放在哪里。
2-2 hello.c写文件
cpp
#include <stdio.h>
#include <string.h>
int main()
{
FILE *fp = fopen("myfile", "w");
if(!fp){
printf("fopen error!\n");
}
const char *msg = "hello bit!\n";
int count = 5;
while(count--){
fwrite(msg, strlen(msg), 1, fp);
}
fclose(fp);
return 0;
}
2-3 hello.c读文件
cpp
#include <stdio.h>
#include <string.h>
int main() {
FILE *fp = fopen("myfile", "r");
if (!fp) {
printf("fopen error!\n");
return 1;
}
char buf[1024];
size_t s;
while (1) {
s = fread(buf, 1, sizeof(buf), fp);
if (s > 0) {
buf[s] = 0; // Null-terminate the string
printf("%s", buf);
}
if (feof(fp)) {
break;
}
}
fclose(fp);
return 0;
}
稍作修改,实现简单cat命令:
cpp
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[]) {
if (argc != 2) {
printf("argv error!\n");
return 1;
}
FILE *fp = fopen(argv[1], "r");
if (!fp) {
printf("fopen error!\n");
return 2;
}
char buf[1024];
while (1) {
int s = fread(buf, 1, sizeof(buf), fp);
if (s > 0) {
buf[s] = 0; // Null-terminate the string
printf("%s", buf);
}
if (feof(fp)) {
break;
}
}
fclose(fp);
return 0;
}
2-4输出信息到显示器,你有哪些方法
cpp
#include <stdio.h>
#include <string.h>
int main()
{
const char *msg = "hello fwrite\n";
fwrite(msg, strlen(msg), 1, stdout);
printf("hello printf\n");
fprintf(stdout, "hello fprintf\n");
return 0;
}
2-5 stdin & stdout & stderr
C默认会打开三个输入输出流,分别是stdin,stdout,stderr
仔细观察发现,这三个流的类型都是FILÉ*,fopen返回值类型,文件指针
cpp
#include <stdio.h>
extern FILE *stdin;
extern FILE *stdout;
extern FILE *stderr;
2-6打开文件的方式
如上,是我们之前学的文件相关操作。还有fseekftellrewind的函数,在C部分已经有所涉猎,

后言
这就是基础IO之理解文件。大家自己好好消化!今天就分享到这! 感谢各位的耐心垂阅!咱们下期见!拜拜~
