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>
int main(int argc, char *argv[])
{
FILE *fp;
if ((fp = fopen('demo.txt', "w+")) == NULL) {
perror("fopen error");
return -1;
}
...
return 0;
}
- perror是标准IO处理错误信息的方式之一:先输出字符串s,在输出错误号对应的错误信息
- 如果是上面程序出错将会输出:fopen error:No such file or directory
关闭
-
关闭一个标准IO流
*int fclose(FILE stream);
成功返回0;失败返回EOF,并设置errno(errno存放错误号)- 流关闭时自动刷新缓冲中的数据并释放缓冲区
- 流一旦关闭就不能执行任何操作
四、读写流
- 流支持不同的读写方式:
- 读写一个字符:fgetc()/fputc() 一次读/写一个字符
- 读写一行: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’
###部分代码块
#define N 6;
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
版权声明:本文为博主雷纳克斯AI(Linux-AI)原创文章,版权归属原作者,如果侵权,请联系我们删除!
原文链接:https://blog.csdn.net/Lsir___/article/details/122690066