D2 - Linux下文件IO

下面是自我测试

  • | 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   
该文件是普通文件
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值