1.狭义文件理解
文件在磁盘
磁盘是永久性存储介质,因此文件在磁盘上的存储是永久性的
磁盘是外设(既是输出设备也是输入设备)
磁盘上的文件本质是对文件的所有操作,都是对外设的输入和输出,简称IO
2.广义理解
Linux下一切皆文件(键盘,显示器,网卡,磁盘等)
3.文件操作的归类认知
对于0kb的空文件是占用磁盘空间
文件是文件属性和文件内容的集合(文件=属性+内容)
所有的文件操作本质是文件内容操作和文件属性操作
系统角度
对文件操作的本质是进程对文件的操作
磁盘的管理者是操作系统
文件的读写本质不是通过C/C++库函数操作的,而是文件相关的系统调用接口实现。
4.代码实现
写文件
用fopen打开文件,模式以w形式,如果输入的文件不存在会创造一个出来,用snprintf函数把msg的内容打印到buffer里面,然后用fwrite把buffer的内容写到fp指向的文件里,这样log.txt里面就有内容显示了。
fwrite的数据项和数据项的数量俩个参数是无所谓的,因为都是一个一个字节的写入。
1 #include<stdio.h>2 #include<string.h>3 4 5 int main()6 {7 8 FILE* fp=fopen("log.txt","w");9 if(fp==NULL)10 {11 perror("fopen fail:");12 return 1;13 }14 const char* msg="hello";15 int cnt=1;16 while(cnt<=10)17 {18 char buffer[1024];19 snprintf(buffer,sizeof(buffer),"%s%d\n",msg,cnt++);20 fwrite(buffer,strlen(buffer),1,fp);21 }22 fclose(fp);23 24 25 26 return 0;27 }
~
读文件
把前面写入的log拿来读,用fread函数来读入到buf里面,然后打印buf就可以看到log.txt的内容了,
fread要看读的是什么,对于字符数组,字符的长度是一个字节,然后有strlen(msg)个这样大小的元素。
1 #include<stdio.h>2 #include<string.h>3 4 5 int main()6 {7 FILE* fp=fopen("log.txt","r");8 if(!fp)9 {10 perror("fopen fail:");11 return 1;12 13 14 }15 char buf[1024];16 const char* msg="hello";17 size_t a=0;18 while(1)19 {20 size_t s=fread(buf,1,strlen(msg),fp);21 if(s>0)22 {23 buf[s]=0;24 printf("%s",buf);25 //printf("%\d",s);26 }27 if(feof(fp))28 break;29 a=s;30 }31 printf("%d\n",a);32 fclose(fp);33 34 return 0;35 }
实现cat命令
父进程会给main的argv参数,再用给的命令行参数可以打开文件,argv[1]第二个元素就是文件名字,然后创建一个数组去把指定文件的内容读到创建的里面,然后打印创建的数组就可以看到对于文件的内容了。
1 #include<stdio.h>2 #include<string.h>3 4 5 int main(int argc,char* argv[])6 {7 if(argc!=2)8 {9 printf("Usage:%s filename\n",argv[0]);10 return 1;11 12 }13 FILE* fp=fopen(argv[1],"r");14 if(fp==NULL)15 {16 perror("fopen");17 return 2;18 19 }20 while(1)21 {22 char buffer[128];23 memset(buffer,0,sizeof(buffer));24 int n=fread(buffer,1,sizeof(buffer)-1,fp);25 if(n>0)26 printf("%s",buffer);27 if(feof(fp))28 break;29 30 31 32 }33 34 fclose(fp);35 return 0;36 }
输出信息到显示器
1 #include<stdio.h>2 #include<string.h>3 4 int main()5 {6 const char* msg="hello\n";7 fwrite(msg,strlen(msg),1,stdout);8 printf("hello\n");9 fprintf(stdout,"hello\n");10 return 0;11 12 13 14 }
~
stdin&stdout&stderr
C默认会打开这三个输入输出流,分别是stdin,stdout,stderr
这三个流的类型都是FILE*,fopen返回值类型,文件指针
# include <stdio.h>extern FILE * stdin ;extern FILE * stdout ;extern FILE * stderr ;