【学习嵌入式day-22-Linux软件编程-IO】
IO
概念
IO是指input/output
linux系统中一切都是文件,IO操作的对象是文件
文件
存放在磁盘中的一段数据的集合
文件通常存放在外存中,掉电后数据不会丢失
分类:
- b (block块设备文件)
- 按块扫描信息的文件,称为块设备文件。通常存储类型的设备为块设备文件
- 使用文件相关的IO
- c (character,字符设备文件)
- 按字符扫描信息的文件,称为字符设备文件,一般设备通常为字符设备文件
- 文件IO
- d (directory,目录文件)
- 目录文件,存放文件的文件夹
- 目录IO、文件IO
- - (普通文件)
- 存放信息的文件
- 标准IO、文件IO
- l (Link,链接文件)
- 操作文件等价于操作文件指向的文件
- 链接IO、文件IO
- s (socket,套接字文件)
- 用来进程间通信
- 文件IO
- p (pipe,管道文件)
- 用来进程间通信
- 文件IO
标准IO
通过用来操作普通文件
普通文件类型
- ASCII码文件:文件中所有内容均为能够在屏幕上显示的ASCII码字符
- 程序、文本文件均为ASCII码文件
- 二进制文件:文件中所有内容均为数据对应的二进制形式存放(包含一些不能在界面上显示的内容)
- ASCII码文件也是二进制文件
- 图片、音视频、压缩包均为二进制文件
标准IO的接口
- fopen/fclose
- fgetc/fputc
- fgets/fputs
- fscanf/fprintf
- fread/fwrite
- fseek/rewind/ftell
- 操作步骤
- 打开文件
- 读写文件
- 关闭文件
文件的打开
fopen
w 会清空文件的内容
w+ 清空文件内容
fclose
使用fgetc和fputc完成文件拷贝
//将源文件的内容拷贝到目的文件中去#include <stdio.h>void copy_file_content(char *pdstfile, char *psrcfile)
{FILE *fsrc = NULL;FILE *fdst = NULL;char ch = 0;fsrc = fopen(psrcfile, "r");if (NULL == fsrc){perror("fail to fopen");return;}fdst = fopen(pdstfile, "w");if (NULL == fdst){perror("fail to fopen");return;}while (1){ch = fgetc(fsrc);if (EOF == ch){break;}fputc(ch, fdst);}fclose(fsrc);fclose(fdst);return;
}int main(void)
{char srcfile[256] = {0};char dstfile[256] = {0};printf("请输入源文件:\n");gets(srcfile);printf("请输入目的文件:\n");gets(dstfile);copy_file_content(dstfile, srcfile);printf("拷贝完成\n");return 0;
}
fputc
putchar()等价于fputc(ch,stdout)
fgetc
ch = getchar() 等价于ch = fgetc(stdin)
fputs
写一行数据时,使用fputs
- fputs不会多打印 \n 字符
- puts会多打印一个 \n 字符
#include <stdio.h>int main(void)
{FILE *fp = NULL;char tmpbuff[1024] = {"how are you"};fp = fopen("a.txt", "w");if(NULL == fp){perror("fail to fopen");return -1;}fputs("hello world\n", fp);fputs(tmpbuff, fp);return 0;
}
fgets
只想要一行数据时,使用fgets
- gets会去掉从终端接收的 \n 字符
- fgets不会去掉从终端接收的 \n 字符
#include <stdio.h>int main(void)
{FILE *fp = NULL;char tmpbuff[1024] = {0};char *pret = NULL;fp = fopen("a.txt", "r");if(NULL == fp){perror("fail to fopen");return -1;}while(1){pret = fgets(tmpbuff, sizeof(tmpbuff), fp);if(NULL == pret){break;}printf("tmpbuff = %s", tmpbuff);}printf("\n");fclose(fp);return 0;
}
fgets和fputs组合使用:
#include <stdio.h>
#include <string.h>int main(void)
{char tmpbuff[256] = {0};while (1){fgets(tmpbuff, sizeof(tmpbuff), stdin);tmpbuff[strlen(tmpbuff)-1] = '\0';if(0 == strcmp(tmpbuff, "quit")){break;}fputs(tmpbuff, stdout);fputs("\n", stdout);}return 0;
}
fprintf
fscanf
已经打开的三个特殊的流
- stdin:标准输入流
- stdout:标准输出流
- srderr:标准出错流
printf、puts、putchar都是通过stdout流实现在终端信息打印
scanf、gets、getchar都是通过stdin流实现获得终端信息
perror通过stderr流实现在终端打印出错信息
标准IO的缓存
标准IO缓存:
是一种由缓存的IO、效率高、实时性差
缓存的类型
- 全缓存(4k)
- 缓存区满 刷新缓存
- 刷新条件:
- 缓存区满4k刷新
- fflush函数强制刷新
- fclose或者程序关闭刷新
- 与文件建立的缓存一般为全缓存
- 行缓存(1k)
- 遇到\n 刷新缓存区
- 刷新条件
- 缓存区满1k(1024字节)刷新
- 遇到\n刷新
- fflush强制刷新
- fclose或者程序关闭刷新
- 与终端建立的缓存(stdin、stdout都是行缓存)
- 不缓存(0k)
- 立即刷新不缓存
- 刷新条件
- 不缓存立即刷新
- 出错处理或者人机交互(stderr不缓存)
man手册
章节
- 系统命令
- 系统调用
- 库函数
- 设备说明
- 文件格式
- 娱乐
- 杂项
- 管理员命令
使用示例
man 章节号 搜索内容