下面是自我测试

  • | Linux下所有皆文件,如何打开文件,如何关闭文件,如何读写文件,
  • | Linux下不是文件就是目录,如何打开目录,如何关闭目录,如何读目录;目录是不能写的哈
  • | 如何获取文件的属性与修改文件的属性

提问:为什么要学使用函数来操作文件>>因为嵌入式编程是机器与机器之间的数据交流,我们现在就算机器人

第一节

  • 文件IO是可移植操作系统的规范定义的一组函数
  • 文件IO相对于标准IO没有流缓冲区
  • 标准IO只能打开普通文件,文件IO函数功能更强大
  • 文件描述符是描述这个文件的一个整数,类似于文件的身份证
  • 文件描述符从0开始,1,2,3,4,依次分配

1.1 open函数与close函数

>>open()详细用法查看man手册就ok
注意:open与fopen函数类似,只是多了个权限的参数

>>close函数成功返回0,错误返回EOF,close的传参是文件标识符
open函数打开方式(必选其一)
O_RDONLY只读
O_WRONLY只写
O_RDWR读写
open函数打开方式(可选)
O_CREAT没有就创建
O_EXCL测试是否存在文件
O_TRUNC如果文件存在就将内容全部其清空
O_APPEND追加
以只写方式打开文件1.txt如果文件不存在则创建;如果文件存在则清空,创建成功后,关闭文件 11 ================================================================*/ 12 #include <stdio.h> 13 #include <string.h> 14 #include <stdlib.h> 15 #include <strings.h> 16 #include <fcntl.h> //文件io头文件,可通过man查找 17 18 void main() 19 {  20 int file_num; //建立文件描述符 21 22 23 //有些参数宏不知道就差man手册 24 file_num = open("1.txt", O_RDONLY | O_CREAT| O_TRUNC) ; 25 26 if(file_num>0) 27 {  28 printf("\n文件打开成功"); 29 30 if( 0==close(file_num) ) //文件关闭函数close 31 {  32 printf("\n文件关闭成功!"); 33 } 34 else 35 {  36 perror("\n文件关闭错误"); 37 } 38 } 39 else //如果文件描述符 < 0,则打开文件失败 40 {  41 perror("\n文件IO错误"); 42 } 43 } ~ ⇒ 结果:文件创建成功,文件关闭成功! 

1.2 read函数 与 write函数


  • read返回实际读取的字节数
  • read出错时返回EOF
  • 读到文件末尾时读不到东西了就返回0
  • read()不会用就查man手册

  • write()与read()的用法一致,成功返回实际写入的字节数,出错时返回EOF
  • 注意文件IO的读写read,write不能同时进行,类似于标准读写fread,fwrite不能在同一个流同时进行一样,必须在一个使用流/文件标识符后关闭文件再操作!
1.txt文件中写入数据后,读取内容并统计大小 --> 理解write(),read()用法 //注意:不能同时进行读写,必须关闭文件! ================================================================*/ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <strings.h> #include <fcntl.h> //文件io头文件,可通过man查找 void main() {  int file_num; //建立文件描述符 /********************************write测试*********************************/ char sendbuf[50] = "hello man !";//待向IO文件写入的内容 file_num = open("1.txt", O_RDWR | O_CREAT) ; if(file_num > 0) {  printf("\nIO文件打开成功!"); while(1) {  //向文件IO写入字符串“hello man !” if(sizeof(sendbuf) == write(file_num,&sendbuf,sizeof(sendbuf)) ) {  printf("\n写入数据成功!"); break; } } if( 0==close(file_num) ) //文件关闭函数close {  printf("\n文件关闭成功!"); } else {  perror("\n文件关闭错误"); } } else {  perror("\n文件IO打开失败!"); } sleep(1); /**************************************read测试*************************************/ /********************打开文件**********************/ //有些参数宏不知道就差man手册 file_num = open("1.txt", O_RDWR | O_CREAT) ; char buf; //接收IO文件的数据 int IO_num = 0; //计数IO文件数据读取个数 int IO_sum = 0; //记录IO文件数据的总的个数 if(file_num>0) {  printf("\n文件打开成功"); while(1) {  IO_num = read(file_num,&buf,1); if(IO_num == 0 ) {  //文件读完退出while break; } else {  IO_sum = IO_sum + IO_num; //计算文件长度 printf("%c",buf); //打印文件内容,单次1字节 } } printf("\n文件长度>>%d",IO_sum); } else //如果文件描述符 < 0,则打开文件失败 {  perror("\n文件IO错误"); } /********************关闭文件**********************/ if( 0==close(file_num) ) //文件关闭函数close {  printf("\n文件关闭成功!"); } else {  perror("\n文件关闭错误"); } } ==> 结果: farsight@ubuntu:~/Desktop$ ./a.out

IO文件打开成功!
写入数据成功!
文件关闭成功!
文件打开成功hello man ! 文件长度>>50 文件关闭成功!farsight@ubuntu:~/Desktop$

1.3 lseek函数 //类似于流定位,用法与流定位一致

  • 成功时返回当前的文件读写位置;出错时返回EOF

  • 注意:lseek函数的用法用的时候参考man手册就ok,记短时间也记不住

10 使用lseek定位函数来判断文件长度 11 ================================================================*/ 12 #include <stdio.h> 13 #include <string.h> 14 #include <stdlib.h> 15 #include <strings.h> 16 #include <fcntl.h> //文件io头文件,可通过man查找 17 void main() 18 {  19 int file_num; //建立文件描述符 20 21 /********************打开文件**********************/ 22 //有些参数宏不知道就差man手册 23 file_num = open("1.txt", O_RDWR | O_CREAT) ; 24 25 if(file_num>0) 26 {  27 printf("\n文件打开成功"); 28 29 printf("\n文件长度%d",lseek(file_num,0,SEEK_END)); //返回定位的位置 30 } 31 else //如果文件描述符 < 0,则打开文件失败 32 {  33 perror("\n文件IO错误"); 34 } 35 /********************关闭文件**********************/ 36 if( 0==close(file_num) ) //文件关闭函数close 37 {  38 printf("\n文件关闭成功!"); 39 } 40 else 41 {  42 perror("\n文件关闭错误"); 43 } 44 } 

第二讲

2.1 访问目录 opendir函数 + readdir函数 + closedir函数

DIR * opendir(const char name): //打开目录流
struct dirent readdir(DIR dirp); //访问目录流
int closedir(DIR*dirp); //关闭目录流

  • opendir成功时返回目录流结构体指针DR;目录流结束/错误返回NULL
  • readdir成功时返回目录下面的一个项也叫做目录项结构体
  • 目录项结构体中我们只需要使用d_name这个东西代表文件名
功能:打印指定的目录下所有文件名称

注意:必须借助man手册进行使用,必须记住函数名, 结构体,返回值这些可以在man手册查找 11 ================================================================*/ 12 #include <stdio.h> 13 #include <string.h> 14 #include <stdlib.h> 15 #include <strings.h> 16 #include <dirent.h> //操作目录流,可参考man 17 void main() 18 {  19 DIR * dir; //定义一个目录流 20 21 //打开目录流 22 dir = opendir("/home/farsight/Desktop"); 23 if(dir!=NULL) //判断目录流打开没 24 {  25 printf("\n目录流打开成功"); 26 } 27 else 28 {  29 printf("\n目录流打开失败"); 30 } 31 32 33 //读取目录流 34 struct dirent* mydirent; //定义一个目录项结构体指针 35 while(1) 36 {  37 mydirent = readdir(dir); //从目录流读取目录项 38 if(mydirent != NULL) //判断目录项是否读完 39 {  40 printf("\n读到文件:%s",mydirent->d_name); 41 } 42 else 43 {  44 printf("\n目录流读完!"); 45 break; 46 } 47 } 48 49 //关闭目录流 50 close(dir); 51 printf("\n关闭目录流"); 52 } ==>结果成功打印了该目录下的所有文件名,验证后是对的


farsight@ubuntu:~/Desktop$ ./a.out

目录流打开成功
读到文件:text.txt
读到文件:.main2.c.swo
读到文件:sxt_ok1.c~ 读到文件:day2.c~ 读到文件:.text.c.swp
读到文件:sxt_ok (复件).c~ 读到文件:.main2.c.swp
读到文件:text.c
读到文件:main2.c~ 读到文件:.. 读到文件:1.txt~ 读到文件:a.out
读到文件:text.txt~ 读到文件:text.c~ 读到文件:main.c~ 读到文件:1.txt
读到文件:base_frans.c~ 读到文件:db.c~ 读到文件:. 读到文件:sxt_ok.c~ 目录流读完!
关闭目录流farsight@ubuntu:~/Desktop$ ls 1.txt 1.txt~ a.out  base_frans.c~ day2.c~ db.c~ main2.c~ main.c~ sxt_ok1.c~ sxt_ok.c~ sxt_ok (复件).c~ text.c  text.c~ text.txt  text.txt~ 

2.2 修改文件的访问权限chmod函数 + lstat (获取文件属性函数) //保护嵌入式设备的数据安全

int chmod(const char*path, mode t mode):
暂时不学习fchmod,他们的功能一样,chmod更方便
int Istat(const char *path, struct stat *buf); 获取文件信息

  • 文件属性结构体 struct stat,包含文件大小,文件ID,所有组ID…

  • 文件类型包含文件是什么类型与文件的访问权限,用结构体 st_mode存储

    文件属性长什么样子
     {
     	-Wr-r- (w=写,r=读)   317 (文件大小)   2014-11-08(修改时间)   test. c(文件名)
     }
通过lstat函数来获取文件信息 11 ================================================================*/ 12 #include <stdio.h> 13 #include <string.h> 14 #include <stdlib.h> 15 #include <strings.h> 16 #include <dirent.h> //操作目录流,可参考man 17 18 //引用三个头文件,可察看man手册 19 #include <sys/types.h> 20 #include <sys/stat.h> 21 #include <unistd.h> 22 23 void main() 24 {  25 struct stat buf; 26 27 if(0 == lstat("/home/farsight/Desktop/text.c",&buf)) 28 {  29 printf("\n获取文件权限成功"); 30 //打印文件信息 31 printf("\n大小:%d ",buf.st_size); 32 printf("\n设备:%d ",buf.st_dev); 33 printf("\nInode:%d ",buf.st_ino); 34 printf("\n硬链接:%d ",buf.st_nlink); 35 printf("\nuid:%d ",buf.st_uid); 36 37 38 //判断文件类型:st_mode & 0170000 = st_mode & 0170000 39 switch(buf.st_mode & S_IFMT) //判断是否是普通文件 40 {  41 case S_IFREG: 42 {  43 printf("\n该文件是普通文件"); 44 break; 45 } 46 } 47 } 48 else 49 {  50 printf("\n获取文件权限失败"); 51 } 52 53 } 54 结果==>> farsight@ubuntu:~/Desktop$ ./a.out

获取文件权限成功
大小:1195 设备:2049 Inode:792598 硬链接:1 uid:1000 该文件是普通文件