【IO进程】标准IO
2017-03-27 19:21
127 查看
IO
针对文件来进行操作, 在linux系统当中几乎所有东西被看做是一个文件来处理文件: 一部分功能就是用来对数据进行存储,常用的文本数据、还有二进制数据
特殊文件是帮助用户站到内存中某一个对象,或者找到对应的设备文件
文件的名字:
类型: bcd-lsp
类型 | 符号 | 作用 |
---|---|---|
常规文件 | - | 它用来存储文本数据、还有二进制数据 |
设备文件 | bc | 对硬件来进行操作的文件 |
目录文件 | d | 进入目录,或者在目录文件下创建文件或者子目录 |
连接文件 | l | 为了快速的找到经常操作的应用程序、或者文件 |
管道文件 | p | 就是帮助你找到内核中开辟的那个内存对象,会在你在当前系统下创建一个文件 |
套接字文件 | s | 在网络中,实现不同电脑不同进程之间的数据传输,用桃姐文件找到内核对象,其实就是内核开辟的一块缓冲区 |
标准IO
概念:
1、什么是标准IO利用c的标准实现数据的输入和输出操作,可以在不同的系统之间进行数据的传输
2、标准IO操作的对象是谁?
文件指针(流): 没打开或者创建一个文件操作系统会为分配两个跟文件相关的结构体
struct file 还有 struct inode 那个文件指针对应的结构体,会帮你找到
这俩个结构体。用指针指向塔它,方便程序员对文件进行操作。
FILE * fp;
3、标准IO的特点: 标准IO当中提供了缓冲区
特点: 就减少系统调用(操作系统给用户提供的操作函数),提高对数据的读写效率 形式: (1)全缓冲,操作的文件 打开文件之后,获取文件 3个条件: a) 缓冲区满,则会刷新缓冲区 4096byte b) 程序正常结束 c) fflush刷新缓冲区 (2)行缓冲,指针对终端进行操作 --> stdin stdout 4个条件: a) 缓冲区满,则会刷新缓冲区 1024 byte b) 程序正常结束 c) fflush刷 新缓冲区 d) \n (3)无缓冲,指针终端进行操作 --> stderr
注意: 这三个文件指针,在应用启动之后,操作系统已为难你分配好了,可以直接使用
文件操作的一个流程
1、创建或者打开文件FILE *fopen(const char *path, const char *mode);
功能: 打开或者创建文件
参数:
path 打开或者创建的文件的名字,传递地址进去
(1)直接写文件的名字 “filename”
(2)通过命令行传参,让程序更具灵活性 argv[1]
r 打开文件对文件进行读操作,文件必须存在,从文件开始读取数据 r+ 打开文件对文件进行读写操作,文件必须存在,从文件开始读取数据 fopen("filename", "r") | fopen("filename", "r+") w 打开或者创建文件,对文件进行写操作,从文件开始写入数据 w+ 打开或者创建文件,对文件进行读写操作,从文件开始读取、写入数据 a 打开或者创建文件,从文件的末尾位置追加写入数据,如果文件不存在,也会创建 文件 a+ 打开或者创建文件,从文件的末尾位置读取、追加写入数据,如果文件不存在,也会创建 文件,读取从文件开始、起始位置读取 返回值: 成功 文件指针 失败 NULL fclose 关闭文件,关闭通过fopen获取的文件指针或者系统分配文件指针
2、对文件进行操作(读、写、文件位置定位操作)
a) 每次读取或者写入单个字符
fgetc / fputc
int fgetc(FILE *stream);
功能: 从文件指针或者系统打开指针stdin中读取数据
参数: stream 通过fopen打开得文件,获取的文件指针 还有stdin
返回值:
成功 读取的字符(强制转换成整形数据,也就是字符对应assic
失败 -1(EOF) 读取文件失败或者出错的情况会给返回-1
int fputc(int c, FILE *stream); 功能: 往文件,fopen获取过来的文件指针或者终端 stdout 写入数据 参数: c 要写入的字符数据 返回值: 成功 写入的字符 失败 EOF int fprintf(FILE *stream, const char *format, ...); 跟prinf的功能相似,只不过需要指定第一个参数,输出的位置是那个地方 stdout(终端)或者 文件指针(文件) b) 每次读取一行数据 fgets fputs char *fgets(char *s, int size, FILE *stream); 功能:从文件指针中读取数据 参数: s 指向用户开辟的缓冲区,实现定义一个数组 size 用于要求读取的字节个数 注意: 1、当要求的字节数小于文件中一行的个数的时候,回读取size - 1个, 并且最后一个字符用\0代替 2、当要求的字节数大于一行的个数会把\n读取进来 stream 打开得文件 返回值: 成功 读取的字符串 失败 NULL int fputs(const char *s, FILE *stream); 功能:输出数据到指定的文件中 参数: s 指向要被读取数据的缓冲区 输出 \n 但是不输出 \0 stream 文件指针 c)二进制数据的输入输出 size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); 功能: 从文件指针读取数据 参数: ptr 事先定义变量,但是需要传递变量地址给ptr size 每一个对象的大小是多少? nmemb 对象的个数是多少? stream 文件指针,你所打开得文件 返回值: 成功 返回实际读取的对象个数,当对象个数最后不满足一个时, 对象个数少一个 做判断时: 判断最后是否大于0 size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream); 功能: 往文件指针写入数据 参数: ptr 事先定义变量,但是需要传递变量地址给ptr size 每一个对象的大小是多少? nmemb 对象的个数是多少? stream 文件指针,你所打开得文件 返回值: 成功 返回实际写入的对象个数,当对象个数最后不满足一个时, 对象个数少一个 做判断时: 判断最后是否大于0 注意:虽然最后读取数据时,对象个数不满足返回,但是会把字节个数读取进数组中 【文件位置定位函数】 int fseek(FILE *stream, long offset, int whence); 功能:用来实现文件的位置定位 参数: whence 基准点 SEEK_SET 文件开头位置 SEEK_CUR 文件当前位置 SEEK_END 文件末尾位置 offset 是用来设置偏移量,正数是往文件的末尾位置移动多少个字节 负数是往文件的开头位置移动多少个字节 0 表示不移动 fseek(fp_r, 5, SEEK_SET); 从文件开始位置往后移动5个字节 fseek(fp_r, 0, SEEK_SET); fseek(fp_r, 5, SEEK_CUR); fseek(fp_r, -5, SEEK_CUR); fseek(fp_r, 0, SEEK_CUR); fseek(fp_r, 5, SEEK_END); fseek(fp_r, -5, SEEK_END); fseek(fp_r, 0, SEEK_END); long ftell(FILE *stream); 返回当前文件位置指针的位置是在那个地址,使用数字的形式表示 void rewind(FILE *stream); 把文件位置指针拉回到开头位置
相关文章推荐
- 【UNIX】标准IO与文件IO的区别
- iPhone的IO电源管理之进程挂起
- IO复用、多进程和多线程三种并发编程模型
- linux文件基础之标准IO
- 监测 Linux 进程的实时 IO 情况
- [Java IO]04_系统标准IO
- 4IO进程
- 文件IO 从键盘输入(标准输入),标准输出。可以输入汉字..strncmp 比较字符串..BUFSIZ
- 【IO进程】守护进程,线程创建、同步与互斥
- [linux基础] 标准IO
- Linux——IO与文件目录管理 进程 exec函数系列 fork 子进程
- 套接字与标准IO及IO流分离
- 标准IO缓冲
- Linux学习(十五):标准IO
- QProcess 读取子进程的标准输出得不到任何内容的原因和解决办法
- IO接口标准(3):HCSL和LPHCSL
- IO复用、多进程和多线程三种并发编程模型比较
- C# System.IO.FileStream 读取被其他程序打开的文件提示“文件正由另一进程使用,因此该进程无法访问该文件。”
- C# IO读取文件问题:正由另一进程使用
- Linux下C编程,进程通信之标准流管道通信(即系统调用)