Linux文件IO(标准I/O<一>)
– 一、标准IO
– 二、流[FILE]
– 三、流的打开与关闭
– 四、读写流
↓
一、 标准IO
- 一句话理解:用标准C写出来的一组具有输入输出的API(应用程序编程接口)函数
- 必须要知道的两个名词:缓冲机制、系统调用。
- 标准IO通过缓冲机制减少系统调用的次数从而达到实现更高效率的处理
二、 流[FILE]
- FILE:标准IO用一个结构体类型来存放打开文件的相关信息[一个FILE结构体代表一个打开的文件]
- 流(stream):FILE又被称为流
- 一句话理解:标准IO的所有操作都是围绕FILE来进行
- 流分为二进制流、文本流 - 在Windows下:文本流( 回车换行:\r+\n)和二进制流(\n)有区别 - 在Linux下:文本流(\n)和二进制流(\n)无区别 - 当程序需要移植到Windows下运行时,要考虑用到二者区别,用二进制流
- 流的缓冲类型 - 全缓冲[打开普通文件时,默认是全缓冲]:当流的缓冲区无数据(写操作)、无空间(读操作)时,进行IO操作 - 行缓冲[标准输入输出(当流和一个终端关联)时]:当在输入和输出遇到换行符(\n)时,进行IO操作 - 无缓冲[输出错误流数据时]:标准错误流输出时数据,直接写入文件,流不进行缓冲
- 标准IO预定义三个流:stdin【标准输入流】 / stdout 【标准输出流】/ stderr【标准错误流】
三、流的打开与关闭
打开
- 打开一个标准IO流 **FILE *fopen(const char path, const char mode); 成功时返回流指针,出错时返回NULL;- path 是流的路径- mode是流的打开方式(r(b)/r+b w(b)/w+b a(b)/a+b)
#include<stdio.h>intmain(int argc,char*argv[]){
FILE *fp;if((fp =fopen('demo.txt',"w+"))==NULL){perror("fopen error");return-1;}...return0;}
- perror是标准IO处理错误信息的方式之一:先输出字符串s,在输出错误号对应的错误信息
- 如果是上面程序出错将会输出:fopen error:No such file or directory
关闭
- 关闭一个标准IO流 *int fclose(FILE stream); 成功返回0;失败返回EOF,并设置errno(errno存放错误号)- 流关闭时自动刷新缓冲中的数据并释放缓冲区- 流一旦关闭就不能执行任何操作
四、读写流
- 流支持不同的读写方式: 1. 读写一个字符:fgetc()/fputc() 一次读/写一个字符2. 读写一行:fgets()/fputs() 一次读/写一行
按字符输入输出
- 按字符输入 - int fgetc(FILE *stream); - 成功时返回读取的字符;若到文件末尾或者出错时返回EOF(-1)
###部分代码块
FILE *fp;int ch, count;if((fp =fopen(argv[1], “r”))==NULL){perror(“fopen”);return-1;}while((ch =fgetc(fp)!=EOF){
count++;}printf(“total bytes %d \n”, count);
- 按字符输出 - int fputc(int c, FILE *stream); - 成功时返回写入的字符;出错时返回EOF(-1)
###部分代码块
FILE *fp;int ch;if((fp =fopen(argv[1], “w”))==NULL){perror(“fopen”);return-1;}for(ch = ‘a’; ch <= ‘z’; ch++){fputc(ch, fp);}
按行输入输出
- 按行输入 - char *fgets(char *s, int size, FILE *stream); - 成功时返回s,到文件末尾或者出错时返回NULL - 遇到’\n’或已输入size-1个字符时返回,最后总是包含’\0’
###部分代码块
#defineN6;char buf[N]fgets(buf, N,stdin);printf(“%s”, buf);
- 假设键盘输入分别是:abcd<回车> abcdef<回车>,buf中的内容是?
- 按行输出 - int fputs(conts char *s, FILE *stream); - 成功时返回输出的字符个数,出错时返回EOF(-1)
###部分代码块
FILE *fp;char buf[] “hello world”;if((fp =fopen(argv[1], “a”))==NULL){perror(“fopen”);return-1;}fputs(buf, fp);
OK了,迪尔 friends,this 章节 is over,见 you next
本文转载自: https://blog.csdn.net/Lsir___/article/details/122690066
版权归原作者 雷纳克斯AI(Linux-AI) 所有, 如有侵权,请联系我们删除。
版权归原作者 雷纳克斯AI(Linux-AI) 所有, 如有侵权,请联系我们删除。