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库文件中声明。
函数作用:创建或打开某个文件。

参数 描述
char* 包含文件名和路径
flag 打开文件的方式
mode 创建文件的权限

flag的选项有:

flag选项 功能
O_RDONLY 只读
O_WRONLY 只写
O_RDWR 读写
O_CREAT 创建一个文件
O_EXCL 检测文件是否存在
O_TRUNC 打开文件覆盖
O_APPEND 打开文件追加

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

返回值:

成功 文件描述符,文件的ID号——inode
出错 -1

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库文件中声明。

参数 描述
int fd 当前文件的文件inode
void *buif 写的内容buf
size_t count 写多少个字节

返回值:实际写的字节数

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

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

参数 描述
int fd 当前文件的文件inode
void *buif 读的内容buf
size_t count 读多少个字节

返回值:实际读的字节数

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

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

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

参数 描述
int fd 当前文件的文件inode
off_t offfset 偏移量,每读写操作所移动的距离,单位是字节的数量。可正负
int whence 当前位置的基点,有三个标志: ①SEEK_SET(文件的开头),②SEEK_CUR(文件指针的当前位置,③SEEK_END(文件的结尾)

返回值:

成功 文件指针的当前位置
出错 -1

例子: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 直接调用内核提供的系统调用函数,头文件是unistd.h
标准IO 是间接调用系统调用函数,头文件是:stdio.h

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

标准IO函数
文件打开关闭 fopen fclose
文件读写 fread fwrite
从文件中读取/输出字符串 fgets fputs
获取、输出字符串 gets puts
从文件中获取、输出字符 fgetc fputc
终端输出输入一个字符 getc putc
输出输入一个字符 getchar putcahr
格式化输入输出、从文件 fscanf fprintf
从字符串 sscanf sprintf
从终端 scanf printf
冲刷缓存区(全缓冲、含缓冲) fflush
光标定位 fseek ftell rewind
文件末尾 feof

标准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_t          d_ino;       /* 节点编号*/off_t          d_off;       /* 目录的下一个偏移位置 */unsigned short d_reclen;    /* 目录大小*/unsigned char  d_type;      /* 目录类型*/char           d_name[256]; /* 目录名字 */};//存放的是目录当中的每个文件的相关信息
文件类型判断DT_BLK      This is a block device. //块设备文件DT_CHR      This is a character device.//字符设备文件DT_DIR      This is a directory.//目录文件DT_FIFO     This is a named pipe (FIFO).//管道文件DT_LNK      This is a symbolic link.//软连接文件DT_REG      This is a regular file.//普通问价DT_SOCK     This 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);//结构体指针

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

  1. 嵌入式系统开发-麦子学院(4)——Linux C初级编程2

    上篇文章讲到了Linux C初级编程的C语言基础部分:https://blog.csdn.net/QiHsMing/article/details/84947781 下面接着Linux C初级编程的L ...

  2. 嵌入式系统开发-麦子学院(12)——ARM Cortex A8 硬件基础(2)

    S5PV210启动原理 ARM启动顺序 BL0(IROM)的作用 初始化系统时钟,设置看门狗,初始化栈和堆 加载BL1 BL1的作用 初始化RAM,关闭Cache,设置栈 加载BL2 BL2的作用 初 ...

  3. 嵌入式系统开发笔记2:Linux的主流发行版本

    本系列文章将向大家介绍嵌入式系统开发的各方面知识. 本文将向大家介绍Linux的主流发行版本. 本文为转载文章,原文网址:Linux各个发行版本对比与简介 首先我们要能够清晰的区分Linux系统内核与 ...

  4. 从零开始的嵌入式系统开发学习Day3(linux C)

    目录 一.输入输出函数 1.1 getchar()/putchar() 1.1.1 getchar() 1.1.2 putchar() 1.2 get()/puts() 1.2.1 gets() 1. ...

  5. Linux高级编程--05.文件读写

    缓冲I/O和非缓冲I/O 文件读写主要牵涉到了如下五个操作:打开.关闭.读.写.定位.在Linux系统中,提供了两套API, 一套是C标准API:fopen.fclose.fread.fwrite.f ...

  6. 嵌入式系统开发笔记0_0:目录

    本系列文章将向大家介绍嵌入式系统开发的各方面知识. 本系列文章所介绍的知识和内容,除电路图设计外,其它均采用开源系统,所以你不会在这个系列文章中看到Keil.IAR等软件. 本系列文章涉及C.C++. ...

  7. 嵌入式系统开发学习步骤(Linux高级编程学习顺序)

    2019独角兽企业重金招聘Python工程师标准>>> 嵌入式系统开发学习步骤(Linux高级编程学习顺序) 1.Linux 基础 安装Linux操作系统 Linux文件系统 Lin ...

  8. LINUX嵌入式系统开发平台选择

    1 嵌入式系统与Linux 按照电气工程师协会的一个定义:嵌入式系统是用来控制或监视机器.装置或工厂等的大规模系统的设备.具体说来,它是电脑软件和硬件的综合体:是以应用为中心,以计算机技术为基础,软硬 ...

  9. 嵌入式系统开发怎样快速度入门

    http://wenda.tianya.cn/wenda/thread?tid=392a249d9d6856c5 实践当然是最锻炼人的方式,但是我想在校生很少有这样的机会,别说本科生,硕士生也未必有条 ...

  10. 嵌入式系统开发-学习路线

    嵌入式系统开发 课程链接 随着嵌入式设备的普及,嵌入式应用的需求量也随之增大,本课程将重点培养基于linux系统下的嵌入式应用开发,包括5个阶段,其中课程涵盖了linux系统下的多进程.多线程嵌入式开 ...

最新文章

  1. html css背景图片精灵技术,HTML入门学习笔记--CSS背景和精灵图(5)
  2. [Ms SQL] 基本創建、修改與刪除
  3. html5 居于页面中心,css笔记:如何让一个div居于页面正中间
  4. 5G NGC — NWDAF 网络智能分析功能
  5. poj3687Labeling Balls
  6. java实现 SSL双向认证
  7. 2020智慧零售行业研究报告
  8. linux查看服务器温度指令,linux查看服务器温度
  9. 创建二叉树的代码_解二叉树的右视图的两种方式
  10. 小程序获取城市经纬度_微信小程序获取当前所在城市的方法
  11. python编程入门与案例详解-Pythony运维入门之Socket网络编程详解
  12. linux 命令学习
  13. 深入理解加载FBX模型文件
  14. 程 | 深度学习 + OpenCV,Python 实现实时视频目标检测 机器之心 09-21
  15. 如何批量导出数据到excel并下载,看这一篇就够了,一看就会
  16. jersey文件服务器,通过jersey实现客户端图片上传
  17. 第五天实验---MGRE环境下的OSPF实验
  18. linux centos无法进入系统,centos无法进入桌面系统
  19. 抓虾的告别信RSS即将退出舞台
  20. H.264/AVC标准参考软件 JM

热门文章

  1. align-item 与 align-content 的区别
  2. python爬虫的意义_爬虫的意义与爬虫基本流程
  3. ftp列表错误或长城宽带连不上ftp的解决方法
  4. [论文笔记] MassBrowser: Unblocking the Censored Web for the Masses, by the Masses
  5. 符冉迪 计算机 培训,一种卫星云图的二次聚类分割方法专利_专利申请于2012-11-30_专利查询 - 天眼查...
  6. 《奥黛丽·赫本》一辈子活在优雅里
  7. 极盾科技荣获2021年梦想小镇7周年“脉冲星奖”
  8. 优秀课程案例:使用Scratch绘制初中数学中心对称图形!
  9. java 多余的空格_Java去除字符串多余空格以及首尾空格
  10. 新一线城市竞争力盘点,用Python绘制动态图带你看懂!