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