Linux----标准IO

声明:个人学习笔记,理解、记录可能有错误,转载请注明出处,保留本文所有权

由来

在每个操作系统之中,对文件的管理与接口均有不同,例如Linux:open;Windows:WinOpen;

所以对同一个文件,在不同的操作系统都有不同的操作代码,所以对代码移植,跨平台运行是不可逾越的阻碍

能不能在诸多的操作系统之上构建出一个统一的文件操作接口呢???

为了实现这个目的,C语言标准委员会发布了一套横跨诸多系统的文件操作接口—标准IO

缓冲区

在标准IO之中用结构体 FILE 来表示一个文件,在结构体中创建了两个缓冲区
1)读缓冲区
2)写缓冲区

缓冲区:即一个暂存数据的内存,类似与寄存器的功能。

那么缓冲区里的数据到底多少的时候才会同步给用户呢??

1)行缓冲:
当数据达到一行时,同步到用户;

假如当前行缓冲区为80字节,那么当字节数达到80个字节或遇到换行符 \n 时,同步输出
eg:printf

main()
{
	printf("This is test");
	//printf("This is test \n");
	while(1);
}

可以看到,加了\n和不加的区别,这就是行缓冲的奥妙

2)全缓冲:

缓冲区中数据填满了整个缓冲区时,数据才会同步

缓冲区的出现,提高了数据传输的速度,同样读取512字节,带缓冲只要一次,而无缓冲要512次。

但标准IO也有无缓冲模式

比如 perror(); 有一个字节就同步一个字节

标准io库,会为自动为每个进程,打开三个标准IO流(文件),
标准输入 : FILE *stdin
stdin是定义在中的一个全局变量,它指向标准输入设备(一般为键盘)
scanf(); 就是从文件stdin中去获取数据

标准输出: FILE *stdout
stdout是定义在中的一个全局变量,它指向标准输出设备(一般为终端)
printf(); 就是把内容输出到stdout中去

标准出错: FILE *stderr
stderr是定义在中的一个全局变量,它指向标准出错设备(一般为终端)
perror(); 不是把出错信息输出到stderr中去

API接口

1)打开一个文件

  #include 

   FILE *fopen(const char *path, const char *mode);

@path:指向要打开的文件文件名(带路径)

@mode :打开文件的方式
“r”: 只读打开。文件不存在,则报错。打开后,光标在开头。

“r+”: 读写打开。文件不存在,则报错。打开后,光标在开头。

“w”: 只写打开。文件不存在,则创建。打开后,文件内容截短(文件内容被清掉)光标在开头。

“w+”:读写打开。文件不存在,则创建。打开后,文件内容截短(文件内容被清掉)光标在开头。

“a”: append 追加打开,文件不存在,则创建。打开后,光标在末尾。

“a+”: 读写打开,文件不存在,则创建。原始读的位置在开头,原始写的位置在末尾。

返回值:

成功返回打开文件的指针  FILE* 后续标准IO库的函数都需要利用它来指定一个文件

失败返回NULL, errno被设置。errno:出错代码。它是在定义在 errno.h中的一个全局变量,表示上一个错误的代码。系统为每一个错误,指定一个出错的代码,

perror是用来把出错代码相应的解释字符串指针出来,

perror(“str”); -> 先输出用户的提示字符“str” 然后在输出  :错误误对应的解释字符串

2)关闭一个文件

       #include 

   int fclose(FILE *stream);

关闭stream指向的文件

返回值:
成功返回0,失败返回非0;

3)文件读写

3.1 单字符读写

       #include 

   int fgetc(FILE *stream);

从stream文件之中读取下一个字符

返回值:
成功返回读取字符的ASCII码,失败返回-1,error被设置

int getc(FILE *stream);

功能同上,二者区别在于fgetc用函数实现,getc用宏实现

 int getchar(void);

从标准输入文件上(键盘等输入设备)获取下一个字符

getchar() <=> fgetc(stdin)

 #include 

   int fputc(int c, FILE *stream);

将指定的C输出到stream文件之中

返回值:
成功返回写入文件中的ASCII码,失败返回-1,error被设置

int putc(int c, FILE *stream);

与fputc的关系如getc与fgetc的关系相同

int putchar(int c);

将指定的C输出到标准输出文件(屏幕等输出设备)中
putchar© <=> fputc(c,stdout);

3.2 行读写

       #include 

   char *gets(char *s);

将标准输入文件获取一行字符存取到s指定的内存中

返回值:
成功返回s的首地址,失败返回NULL,error被设置

gets有一个bug,gets没有考虑空间问题,存在越界问题!!!

故而fgets应运而生

  char *fgets(char *s, int size, FILE *stream);

@ s : 指向的空间用来保存从文件中读取的数据

@ size :表示最多获取的字节数
fgets结束的情况:
1)遇到\n或文件结束
2)读取到size-1个字节,第size个字节自动补\0;

@ stream :表示从哪个文件中读取

后面还有 fputs、puts 不再赘述

3.3直接读写

 #include 

   size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

从stream指向的文件中读取一个数组(数组为N个,每个元素大小为size)到ptr指向的空间中

返回值:
成功返回实际读出文件的数组元素个数,失败返回-1,同时error被设置

size_t fwrite(const void *ptr, size_t size, size_t nmemb,
                 FILE *stream);

将ptr指向的数组元素输出到ptr指向的空间中

返回值:
成功返回实际写入文件的数组元素个数,失败返回-1,同时error被设置

你可能感兴趣的:(随笔记)