下面是自我测试
- | 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 该文件是普通文件