文章目录
1.IO知识
1.1最先接触的IO知识
#include <stdio.h> #include <unistd.h>
stdandard input output:标准IO (printf/scanf)
input :通过终端向程序输入数据
output:程序的结果通过终端(显示屏等)输出
1.2IO的种类
标准IO :库函数
文件IO :系统调用
1.3什么是系统调用?
系统调用(posix(可移植操作系统的标准)):从用户空间到内核空间的切换过程,不同的操作系统系统调用的接口是不同的。只要从用户空间到内核空间了就要发生一次系统调用,效率比较低。系统调用没有缓冲区。
库函数(ANSI C):库函数的平台的通用新更强,库函数有缓冲区,效率比系统调用高。库函数=缓冲区+系统调用
1.4常用的函数接口的种类
标准IO:API
printf
scanf
fopen
fread
fwrite
fclose
fgetc
fputc
fgets
fputs
...
文件IO:API
open
read
write
close
...
2.Linux系统中ctags的使用
2.1ctags是什么?
在Linux系统中追代码的一个工具
2.2创建索引
ctags -R =====>tags的索引文件
2.3追代码的使用
vi -t 函数/变量
ctrl+] 在文件内继续跳转
ctrl+t 回退
3.关于缓冲区的问题
3.1缓冲区种类和大小
全缓存:和文件相关的缓冲区就是全缓存 (fp 4096字节)
行缓存:可终端相关的缓冲区是行缓存 (stdin stdout 1024字节)
不缓存:标准出错没有缓冲区(stderr 0字节)
#include <stdio.h>
int main(int argc,const char * argv[])
{
#if 1
int num;
// //stdin 行缓存1024
//标准输入的大小缓冲区是1024字节
scanf("%d",&num); //必须输入,才能看到大小
printf("stdin size = %ld\n",
stdin->_IO_buf_end - stdin->_IO_buf_base);
//stdout 行缓存1024
printf("stdout size = %ld\n",
stdout->_IO_buf_end - stdout->_IO_buf_base);
//stderr 不缓存0
printf("stderr size = %ld\n",
stderr->_IO_buf_end - stderr->_IO_buf_base);
#else
FILE *fp;
if((fp = fopen("01fopen.c","r"))==NULL){
perror("fopen error");
return -1;
}
fgetc(fp);
//全缓存,大小是4K
printf("fp size = %ld\n",
fp->_IO_buf_end - fp->_IO_buf_base);
fclose(fp);
#endif
return 0;
}
3.2缓冲区刷新时机
3.2.1行缓存的刷新时机
1.行缓存遇到’\n’字符会刷新缓冲区
2.程序执行结束,也会刷新行缓冲区
3.当输入和输出发生切换的时候也会刷新缓冲区
4.当关闭文件指针的时候也会刷新缓冲区
5.fflush主动刷新缓冲区
6.如果(行)缓冲区满了,会刷新缓冲区
#include <stdio.h>
int fflush(FILE *stream);
功能:主动刷新缓冲区
参数:
@stream:文件指针
返回值:成功返回0,失败返回EOF置位错误码
#include <stdio.h>
int main(int argc,const char * argv[])
{
//1.行缓存遇到'\n'字符会刷新缓冲区
// printf("hello world\n");
// while(1);
//2.程序执行结束,也会刷新行缓冲区
// printf("hello world");
//3.当输入和输出发生切换的时候也会刷新缓冲区
// int num;
// printf("hello world");
// scanf("%d",&num);
// while(1);
//4.当关闭文件指针的时候也会刷新缓冲区
// printf("hello world");
// fclose(stdout);
// while(1);
//5.fflush主动刷新缓冲区
// printf("hello world");
// fflush(stdout);
// while(1);
//6.如果(行)缓冲区满了,会刷新缓冲区
int i=0;
while(i<1029){
printf("%c",'a');
i++;
}
while(1);
return 0;
}
3.2.2全缓存的刷新时机
1.程序执行结束,也会刷新全缓存
2.输入输出发生切换的时候,会刷新全缓存
3.关闭文件指针,会刷新全缓存
4.fflush主动刷新缓冲区
5.全缓存满,也会刷新缓冲区
#include <stdio.h>
int main(int argc,const char * argv[])
{
FILE *fp;
if((fp = fopen("hello.txt","w+"))==NULL){
perror("fopen error");
return -1;
}
//1.全缓存遇到换行符不会刷新缓冲区
// fputc('a',fp);
// fputc('\n',fp);
// while(1);
//2.程序结束,会刷新全缓存
// fputc('a',fp);
//3.输入输出发生切换的时候,会刷新全缓存
// fputc('a',fp);
// fgetc(fp);
// while(1);
//4.关闭文件指针,会刷新全缓存
// fputc('a',fp);
// fclose(fp);
// while(1);
//5.主动调用fflush(fp);
// fputc('a',fp);
// fflush(fp);
// while(1);
//6.全缓存满,也会刷新缓冲区
int i=0;
while(i<4097){
fputc('a',fp);
i++;
}
while(1);
return 0;
}
while(1);
//5.主动调用fflush(fp);
// fputc('a',fp);
// fflush(fp);
// while(1);
//6.全缓存满,也会刷新缓冲区
int i=0;
while(i<4097){
fputc('a',fp);
i++;
}
while(1);
return 0;
}