LINUX基础——标准IO

本文主要介绍标准IO的相关概念、缓冲区、FILE指针和流、标准IO相关函数等,在linux中非常重要,对于基本概念理解后,对于标准IO的相关函数一定要进行代码验证,对于参数和返回值做以理解。

1.IO基本概念:

I:input

O:output

输入:从键盘将数据输入到内存中

输出:从内存将数据拷贝到显示屏上

scanf、printf的理解

输入:从文件将数据输入到内存中

输出:从内存将数据拷贝到文件中

2.文件相关概念:

文件:一组相关数据的有序集合(视频、音频等)

文件名:这个数据集合的名字

3.文件类型:

普通文件:

a--ASCII码文件(文本文件) 

b--二进制文件(图片、视频等)

d--目录文件

l--链接文件

b--块设备文件

c--字符设备文件

p--管道文件

s--套接字文件(socket)

4.标准IO:

特点 :

1.既可以在windows下使用,也可以在linux下使用(可跨平台)

2.标准I/O库由ANSI C标准说明

3.有缓冲机制

4.通过文件流指针(FILE*)来操作

4.1 系统调用:

系统:操作系统

调用:调用函数

系统调用:操作系统提供给应用程序的接口(函数) 

4.2 缓冲区

缓冲机制:减少系统调用的次数

全缓存:当缓冲区满,程序运行结束,强制刷新缓冲区时会刷新缓冲区

行缓存:当缓冲区满,程序运行结束,强制刷新缓冲区遇到换行符时会刷新缓冲区

不缓存:当程序运行起来后,有三个文件默认已经打开:标准输入,标准输出,标准出错,对应的流指针为:stdin,stdout,stderr

4.3 FILE指针

定义:每个被使用的文件都在内存中开辟一个区域,用来存放文件的相关信息,这些信息是保存在一个结构体类型的变量中,该结构体类型是由系统定义的,取名为FILE。

-->标准I/O库的所有操作都是围绕流(stream)来进行的,在标准I/O中,流用FILE*来描述。

流:字节的进进出出(文本流、二进制流)

注:只有标准IO才有流的概念

文本流:----对应的ASCII码值

eg:  2  0  0  1 ---->50,48,48,49

二进制流:----十进制转二进制

eg:2001---->00000111 11010001

4.4  标准IO

1.文件操作步骤

打开文件----操作文件(读/写)----关闭文件

2.打开文件(open)

函数原型:FILE *fopen(const char *pathname, const char *mode);

函数功能:打开文件

参数1:要打开文件的路径

参数2:打开的方式

返回值:成功返回文件流指针(FILE*),失败返回NULL

注:打开的方式有很多,如:r表示以只读方式打开文件,文件不存在则出错,r+表示以可读的方式打开文件,文件不存在则出错,w表示以只写的方式打开文件,若文件存在则清空文件内容,不存在则创建......具体的可以查询一下

3.操作文件

3.1 按字符读写

输入:getchar()为从键盘进行输入,fgetc()既可以从键盘输入,也可以从文件中输入(读取)

输出:putchar()为输出到显示屏上,fputc()也可

int fgetc(FILE *stream);

函数功能:从指定的流中读取一个字符

参数:fopen的返回值,已经打开的文件流指针

返回值:成功返回读到的ASCII码值,读到文件末尾或者失败返回-1

int fputc(int c, FILE *stream);

函数功能:向指定的流中输出一个字符

参数1:要输出的字符

参数2:文件流指针

返回值:成功返回写入的ASCII码值,失败返回-1

int feof(FILE *stream);

函数功能:判断文件是否到达文件末尾

参数:要操作的流指针

返回值:如果非0表示到达文件末尾,如果为0表示没有到达文件末尾

注:feof既可以判断文本文件是否到达文件末尾,又可以判断二进制文件是否到达文件末尾

3.2按行读写

gets( )、puts( )

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

函数功能:从指定的流中读取字符串

参数1:保存读取到的内容的首地址

参数2:空间的大小

参数3:要操作的文件流指针

返回值:成功返回读取到的内容的首地址,失败返回NULL

注:最多读取size-1个字符

        fgets读取的时候会将换行符也读入

        

int fputs(const char *s, FILE *stream);

函数功能:向指定的流中输出字符串

参数1:要输出的内容的首地址

参数2:要操作的流指针

返回值:成功返回非负整数,失败返回-1

注:fgets和gets的区别----a、fgets比gets更安全;b、fgets会读取换行符,gets不会

        fputs和puts的区别----a、puts会自动添加换行,puts不会

3.3 按块读写

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

功能:按块读取内容

参数1:读到内容空间的首地址

参数2:块的大小

参数3:块的个数

参数4:文件流指针

返回值:成功返回读到的块数,失败返回-1

注:不够1个块的大小,按0处理;一般情况下,将size设置成1,返回值为实际读到的字节数

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

功能:向指定的流中写入数据

参数1:要写入数据的空间的首地址

参数2:块的大小

参数3:块的个数

参数4:要操作的文件流指针

返回值:成功返回写入的块数,失败返回-1

4.关闭文件

int fclose(FILE *stream);

参数:文件流指针,fopen的返回值

返回值:成功返回0,失败返回-1(EOF)

注:EOF只能判断是否到达文本文件的末尾,不能判断是否到达二进制文件的末尾

5.ftell

long ftell(FILE *stream);

函数功能:获取文件当前位置

参数:要操作的文件流指针

返回值:返回当前文件的指示

6.fseek

int fseek(FILE *stream, long offset, int whence);

参数1:要操作的流指针

参数2:偏移量

参数3:偏移的位置

SEEK_SET:文件的开头

SEEK_CUR:文件的当前位置

SEEK_END:文件末尾

----------------------------------------------------------------------------end--------------------------------------------------------

写在文末:下章我们对于文件IO进行学习!

猜你喜欢

转载自blog.csdn.net/bx1091182836/article/details/128906386