1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 嵌入式系统开发-麦子学院(5)——linux高级编程之文件IO管理

嵌入式系统开发-麦子学院(5)——linux高级编程之文件IO管理

时间:2024-01-10 10:46:58

相关推荐

嵌入式系统开发-麦子学院(5)——linux高级编程之文件IO管理

linux高级编程之文件IO管理

接上篇文章:嵌入式系统开发-麦子学院(4)——Linux C初级编程2

1. 文件IO

linux 系统中,文件IO的流程,如下图所示。

文件IO有5个函数:open()read(),write(),close(),leek()

1.1 open - 打开或创建一个文件*

open(char*,flag,mode)在fcntl.h库文件中声明。

函数作用:创建或打开某个文件。

flag的选项有:

创建文件的权限:mode &(~umask)

返回值:

1.2 close - 关闭一个文件inode

close(int inode)。

例子:touch命令的实现

#include "stdio.h"#include "unistd.h"#include "fcntl.h"int main(){int fd;fd = open(argv[1],O_CREAT|O_RDWR,0777);if(fd<0){printf("creat file %s failure\n",argv[1]);return -1;}printf("create file %s sucess\n",fd = %d\n",argv[1],fd);close(fd);return 0 ;}

1.3 write -写数据到一个文件

write(int fd,void *buf,size_t count)。在fcntl.h库文件中声明。

返回值:实际写的字节数

1.4 read -读取一个文件的数据

read(int fd,void *buf,size_t count)

返回值:实际读的字节数

1.5 leek-读取一个文件的位置指针

leek(int fd,off_t offset,int whence)。在sys/types.hunistd.h库文件中声明。

作用:调整读写的位置指针。

返回值:

例子:cp命令的实现

#include <stdio.h>#include <unistd.h>#include <fcntl.h>#include <string.h>int main (int argc, char *argv[]){int rd_fd,wr_fd;char read_buf[128] = {0};char write_buf[128] = {0};int rd_ret = 0;if(argc <3){printf("please input src file and des file \n");return -1;}rd_fd = open(argv[1],O_RDONLY);if(rd_fd < 0 ){printf("open src file %s failure\n",argv[1])return -2;}wr_fd = open (argv[2],O_WRONLY);if(wr_fd <0){printf("open des file %s failure\n",argv[2])return -3;}while(1){rd_ret = read(rd_fd,read_buf,128);if(rd_ret < 128)break;write(wr_rd,read_buf,rd_ret);memset(wr_fd,read_buf,re_ret);}write(wr_rd,read_buf,rd_ret);close(rd_fd);close(wr_fd);}

2.标准IO

标准IO与文件IO的区别:

标准IO的实质还是通过C库函数去调用文件IO。

标准IO缓存机制:① 用户缓存 ② c库缓存 ③内核缓存

库缓存

1)全缓冲:全缓冲指的是系统在填满标准IO缓冲区之后才进行实际的IO操作;注意,对于驻留在磁盘上的文件来说通常是由标准IO库实施全缓冲。

读:fread 写:fwrite

2)行缓冲:在这种情况下,标准IO在输入和输出中遇到换行符时执行IO操作;注意,当流涉及终端的时候,通常使用的是行缓冲。

遇到换行符(\n)或写满缓存时,调用系统调用函数 stdout 读:fgets ,gets,printf,fprintf,sprintf写:fputs,puts,scanf

3)无缓冲:无缓冲指的是标准IO库不对字符进行缓冲存储;注意,标准出错流stderr通常是无缓冲的。

无缓存 stderr

1.文件的打开 fopen()

头文件:#include <stdio.h>函数原型:FILE *fopen(const char *path, const char *mode);返回值: 成功 返回FILE * 类型的指针指向你要打开文件失败 返回NULL 函数参数:const char *path ---->你要打开文件的位置 const char *mode ----》文件权限r以只读的方式打开文件r+ 以可读可写的方式打开文件w以只写的方式打开文件,如果文件存在就清空,如果文件不存在就创建w+ 以可读可写的方式打开文件,如果文件存在就清空,如果文件不存在就创建a追加,如果文件不存在就新建 a+ 以读取和追加(文件末尾的写入),如果文件不存在,则创建它。

2.文件的读写 fread() fwrite()

头文件:#include <stdio.h>函数原型size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);返回值: 成功 返回读取到完整的数据块的个数失败 返回0或者小于的数判断文件是否读完不要在用返回值判断,新方式feof()判断函数参数:void *ptr----》存储空间名size_t size ----》每一个数据块的大小 字节size_t nmemb ----》打算读取多少个数据块FILE *stream ----》文件类型的FELE *的文件指针size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);

3.文件的关闭 fclose()

头文件:#include <stdio.h>函数原型:int fclose(FILE *fp);返回值: 成功 返回0失败 返回feof()监测函数参数:FILE *fp 文件描述符

4.判断文件的结束标志 feof()

头文件:#include <stdio.h>函数原型:int feof(FILE *stream);返回值: 不等于0 ---》文件读取完毕等于0 ---》文件没有读取完毕

5.设置文件的读写偏移 fseek()

#include <stdio.h>int fseek(FILE *stream, long offset, int whence);返回值:成功 返回0失败 返回-1 注意:lseek返回值和fseek()返回值意思不一样参数:FILE *stream FILE * 文件long offset 偏移量int whence 偏移的位置SEEK_SET 文件的开头SEEK_CUR 当前的位置SEEK_END 文件的末尾 例子:fseek(filep1,0,SEEK_SET);long ftell(FILE *stream);返回值:成功 返回文件当前位置距离文件开头的字节数失败 返回-1例子:long ftell(filep1);相当于fseek(filep1,0,SEEK_END);void rewind(FILE *stream);//没有返回值例子:void rewind(filp1)//等价于fseek(filep1,0,SEEK_SET)将文件的偏移设置为起始位置

6.获取文件属性 fstat()

头文件:#include <sys/stat.h>int fstat(int fildes, struct stat *buf);返回值:成功 返回0失败 返回-1参数:int fildes 你要获取属性的那个文件的文件描述符struct stat *buf 存放你获取到的文件属性

7.fprintf() fscanf() sprintf() sscanf()

标准输入stdin标准输出stdout标准错误输出 stderr可变参的函数(变参函数)#include <stdio.h>1) int fprintf(FILE *stream, const char *format, ...);参数:FILE *stream FILE * 文件名const char *format 字符串...例子:fprintf(filep,"hello%s%d%.2f\n",buf,year,d);//文件内容拼接2) int sprintf(char *str, const char *format, ...);//按照你指定的格式拼接字符串,比strcat要厉害参数:char *str 字符串拼接指定位置const char *format 字符串格式... 例子:sprintf(buf0,"%sworld-%d-%d-%d",buf,year,month,day);3) int fscanf(FILE *stream, const char *format, ...);参数:FILE *stream FILE * 文件名const char *format 字符串...往文件里面添加内容4) int sscanf(const char *str, const char *format, ...);//按照你指定的格式拆分字符串参数:char *str 字符串拆分指定位置const char *format 字符串格式... 例子:sscanf(time,"%d-%d-%d",&year,&month,&day);//访问的是地址 &

8.fputs() fgets() fputc() fgetc() puts() gets() putchar() getchar()

#include <stdio.h>int fgetc(FILE *stream);//从文件中读取一个字符 fread(buf,1,1,stream);返回值:你读取到的那个字符的ASCII码int getc(FILE *stream);//从文件当中读取一个字符返回值:你读取到的那个字符的ASCII码char *fgets(char *s, int size, FILE *stream);//从文件读取size个字节的数据放到指针s中返回值:返回读到的字符串的首地址 指针fgets(buf,100,stdin);//获取键盘输入int getchar(void);//监测缓冲区的回车字符while(getchar()!='\n') char *gets(char *s); gets(buf);//默认获取键盘输入的字符串#include <stdio.h>int fputc(int c, FILE *stream);//往文件中写入一个字符 fwriteint putc(int c, FILE *stream);//往文件中写入一个字符 fwriteint fputs(const char *s, FILE *stream);//相当于打印fputs(buf,stdout);int putchar(int c); //打印字符putchar(a)==putchar(97)int puts(const char *s);//打印字符串 puts(buf);

目录IO

1.1目录的打开 opendir()

头文件#include <sys/types.h>#include <dirent.h>函数原型:DIR *opendir(const char *name);返回值:成功 返回DIR类型的指针指向你打开的目录失败 返回NULL参数:const char *name 完整的目录路径

1.2 目录的读取 readdir()

#include <dirent.h>struct dirent *readdir(DIR *dirp);返回值:struct dirent 目录结构体指针struct dirent {ino_td_ino; /* 节点编号*/off_td_off; /* 目录的下一个偏移位置 */unsigned short d_reclen; /* 目录大小*/unsigned char d_type;/* 目录类型*/char d_name[256]; /* 目录名字 */};//存放的是目录当中的每个文件的相关信息文件类型判断DT_BLKThis is a block device. //块设备文件DT_CHRThis is a character device.//字符设备文件DT_DIRThis is a directory.//目录文件DT_FIFOThis is a named pipe (FIFO).//管道文件DT_LNKThis is a symbolic link.//软连接文件DT_REGThis is a regular file.//普通问价DT_SOCKThis is a UNIX domain socket.//套接字文件DT_UNKNOWN The file type is unknown.//不认识类型

1.3新建目录 mkdir

#include <sys/stat.h>函数原型:int mkdir(const char *path, mode_t mode);参数:const char *path ----》你要建立的目录的路径mode_t mode----》新建文件的权限 07771.4关闭目录 closedir()#include <sys/types.h>#include <dirent.h>int closedir(DIR *dirp);//结构体指针

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。