1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > Linux应用层——IO(输入输出)编程

Linux应用层——IO(输入输出)编程

时间:2023-01-22 04:50:40

相关推荐

Linux应用层——IO(输入输出)编程

目录

一、IO基础内容

1.文件与文件名

2.linux的文件分类

3.标准IO和文件IO的区别

3.1-系统调用:文件IO函数接口

3.2-库函数:标准IO函数接口

4.文件描述符-------------*

5.标准输入、标准输出和标准出错

6.不用缓存的I/O——文件IO

7.需要缓存的I/O——标准IO

8.全局错误码

9.错误信息输出

二、标准IO

1.特点

2.文件指针

3.流

3.1-文本流---会转化\n

3.2-二进制流---不会转换\n

4.缓冲文件系统(高级磁盘IO)---标准IO

函数——fflush()

5.标准IO的API:标准IO的函数接口

5.1-打开文件

函数——fopen();

5.2-操作文件

函数——fgetc

函数——宏:getc

函数——getchar();

函数——fputc

函数——putc

函数——fgets

函数——gets --------*

close()

三、文件IO

四、时间编程

一、IO基础内容

1.文件与文件名

文件:一组相关数据的有序集合

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

2.linux的文件分类

常规文件 :-

(1)、ASCII码文件

(2)、二进制的文件

目录字符设备:c (character) /dev

块设备 :b (block)/dev

有名管道 :p (pipe) ---多进程线程

套接口 :s (socket) ---网络编程

符号链接(软链接) :l (link)

目录文件 :d (directory file)

链接分类:

软链接和硬链接

软链接:通过路径或文件名建立链接

硬链接:通过inode码建立链接( inode码:系统赋予文件的真实名字)

你:cd 2211,系统: cd 398797

3.标准IO和文件IO的区别

3.1-系统调用:文件IO函数接口

(1)用户空间进程访问内核的接口

(2)把用户从底层的硬件编程中解放出来

(3)极大的提高了系统的安全性

(4)使用户程序具有可移植性

(5)是操作系统的一部分

3.2-库函数:标准IO函数接口

(1)库函数为了实现某个功能而封装起来的API集合

(2)提供统一的编程接口,更加便于应用程序的移植

(3)是语言或者应用程序的一部

4.文件描述符-------------*

(1)、顺序分配的非负整数

(2)、内核用以标识一个特定进程正在访问的文件

(3)、其他资源(socket、pipe等)的访问标识

5.标准输入、标准输出和标准出错

由shell默认打开,分别为0/1/2

标准文件流:

linux系统一开机就会打开的三个文件

文件描述符 名称 作用

0 标准输入 通过键盘输入的数据

1 标准输出 通过屏幕输出的数据

2 标准错误输出 通过屏幕输出的错误信息

6.不用缓存的I/O——文件IO

通过文件描述符进行访问:

open()/read()/write()/lseek()/close()…

7.需要缓存的I/O——标准IO

通过FILE*进行访问---文件指针/流 是一个特殊空间类型

printf()/fprintf()/fopen()/fread()/fwrite()/fseek()/fclose()…

8.全局错误码

用来反馈函数调用失败

函数调用分两种情况:1、成功

2、失败 -1,2

错误码全局可见

错误种类:/usr/include/asm-generic/errno-base.h

/usr/include/asm-generic/errno.h

9.错误信息输出

(1)strerror() - 映射errno对应的错误信息

(2)perror() – 输出用户信息及errno对应的错误信息----*

二、标准IO

1.特点

(1)标准I/O库由ANSI C标准、说明----标准IO由C库提供

(2)标准I/O库处理很多细节,如缓存分配、以优化长度执行I/O等,这样使用户不必关心如何选择合适的块长度----标准IO相对比较智能

(3)标准I/O在系统调用函数基础上构造的,它便于用户使用

----标准IO是基于文件IO开发出来的

(4)标准I/O库及其头文件stdio.h为底层I/O系统调用提供了一个通用的接口。

----标准IO是基于文件IO开发出来的 ,从底层IO变成上层IO

(5)标准IO拥有缓冲区,而文件IO没有

2.文件指针

(1)文件指针:流

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

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

(4)标准I/O库是由Dennis Ritchie在1975年左右编写

3.流

定义所有的IO操作,都是数据从程序中移进或移出/写入或读取,这种数据,就叫做:流

分类:

文本流/二进制流

3.1-文本流---会转化\n

定义:在流中处理的数据是以字符出现。在文本流中,’\n’被转换成回车符CR和换行符LF的ASCII码0DH和0AH。而当输出时,0DH和0AH被转换成’\n’

例如:数字2001在文本流中的表示方法为 ‘2’ ‘0’ ‘0’ ‘1’

ASCII: 50 48 48 49

3.2-二进制流---不会转换\n

定义:流中处理的是二进制序列。若流中有字符,则用一个字节的二进制ASCII码表示;若是数字,则用对应的二进制数表示。对’\n’不进行变换

例如:数字2001在二进制流中的表示方法为 00000111

4.缓冲文件系统(高级磁盘IO)---标准IO

目的:尽量减少使用read/write的调用---尽量减少系统调用的次数

定义:系统自动的在内存中为每一个正在使用的文件开辟一个缓冲区,从内存向磁盘输出数据必须先送到内存缓冲区,装满缓冲区在一起送到磁盘中去。从磁盘中读数据,则一次从磁盘文件将一批数据读入到内存缓冲区中,然后再从缓冲区逐个的将数据送到程序的数据区。内存会为每一个文件的空间开辟缓冲区,要想写入到文件中,必定要先经过缓冲区

缓冲分类——全缓存,行缓存,不缓存

全缓冲:----常规文件

缓冲区刷新条件:

(1)缓冲区满了

(2)文件被关闭了---fclose();----关闭流

(3)程序正常结束

(4)利用函数强制刷新---fflush();

行缓存:-----标准输入、标准输出

行缓冲刷新条件:

(1)缓冲区满了

(2)文件被关闭了---fclose();----关闭流

(3)程序正常结束

(4)利用函数强制刷新---fflush();

(5)缓冲区中遇到‘\n’

不缓存:-----标准错误输出

只要向缓冲区中写数据就会刷新

函数——fflush()

#include <stdio.h>int fflush(FILE *stream);功能: 强制刷新缓冲区 参数: stream:流 ---0 1 2返回值: 成功返回0 失败返回EOF,并返回错误码

文件描述符 名称 文件指针/流

0 标准输入 stdin

1标准输出stdout

2标准错误输出 stderr

5.标准IO的API:标准IO的函数接口

标准IO:

格式化IO: ---printf/scanf 自定义输入/输出格式

非格式化IO:---对文件的操作无法自定义输入

标准io—函数概要

一、打开文件

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

二、操作文件

(1)一次读一个字符

int fgetc(FILE *stream);

int getchar(void);//最大的区别就是:getc是宏,fgetc是函数

(2) 一次写入一个字符:

int fputc(int c, FILE *stream);//对相应的流写入一个字符

int putchar(int c);//向标准输出写一个字符

(3)一次读一行字符

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

char *gets(char *s);

(4)一次写入一行数据:

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

int puts(const char *s);

(5)一次读一块字符-----------*

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

(6)一次写入一块字符

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

(7)关闭文件

int fclose(FILE *stream);

(8)标准IO的移动光标

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

5.1-打开文件

函数——fopen();

#include <stdio.h>

FILE *fopen(const char *pathname, const char *mode);功能: 打开文件、将文件的属性赋予到流中参数: pathname:文件路径:带路径的文件名mode:打开文件的方式以及权限 分6个

代号权限 打开文件的情况 写的方式

r 只读 文件必须事先存在

r+可读可写 文件必须事先存在清空模式

w 只写 文件不存在则创建清空模式

w+ 可读可写文件不存在则创建清空模式

a 只写 文件不存在则创建追加模式

a+ 可读可写 文件不存在则创建追加模式

返回值: 成功返回:流:文件指针失败返回NULL,并返回错误码

5.2-操作文件

主要:读写

次要:读写的方式

函数——fgetc

所在库:#include <stdio.h>格式:int fgetc(FILE *stream);功能: 根据相应的流,读取一个字符参数:stream:流 返回值: 成功返回读取到的一个字符,失败返回EOF,并返回错误码读到末尾返回0

函数——宏:getc

getc和fgetc的功能、参数、返回值都一样 ,用法也一样最大的区别就是:getc是宏,fgetc是函数#define getc fgetc #define wuyanzu guolaoshi

函数——getchar();

所在库:#include <stdio.h>格式:int getchar(void);功能: 在标准输入读取一个字符参数: void:空 返回值: 成功返回读取到的字符 ,失败返回EOF,并返回错误码重点:getchar主要作用是用来吃垃圾字符的getchar()!='\n'

函数——fputc

所在库:#include <stdio.h>格式:int fputc(int c, FILE *stream);功能: 对相应的流写入一个字符 参数: c:需要写入的字符 stream:流 返回值: 成功返回写入的字符 ,失败返回EOF,并返回错误码实现文件copy功能

函数——putc

是fputc的宏:用法,功能,参数,返回值都和fputc一模一样 格式:int putc(int c, FILE *stream);putchar----getchar 所在库:#include <stdio.h>int putchar(int c);功能: 向标准输出写一个字符 参数: c:需要写入的字符 返回值: 成功返回写入的字符,失败返回EOF,并返回错误码

函数——fgets

所在库:#include <stdio.h>格式:char *fgets(char *s, int size, FILE *stream);功能: 对相应的文件流读取一行数据,遇到‘\n’就自动停止读取参数: s:读取出来的数据放置的地方 char buf[128];size:读取数据的最大限度,读一次读多少个字节size -1 ,'\0'stream:流 返回值: 成功返回读出数据存放的地址 ,失败返回NULL,并返回错误码读到末尾返回:NULL,success

函数——gets --------*

所在库:#include <stdio.h>格式:char *gets(char *s);功能: 在标准输入读取一行数据参数: s:读取数据存放的位置 返回值: 成功返回读取数据的地址,失败返回NULL,并返回错误码PS:注意,为了安全,gets少用,因为该函数没有限制标准输入一行数据的最大值,如果你输入的数据比char *s的大 ,会发生内存越界,堆栈溢出

函数——fputs()

所在库——#include <stdio.h>int fputs(const char *s, FILE *stream);功能:写入一行数据到相应的文件中参数: s:需要写入的数据放置的地方:char buf[50];stream:流返回值: 成功:非负数 失败返回EOF,并返回错误码

函数——puts()

#include <stdio.h>int puts(const char *s);功能: 向标准输出写入一行数据 参数: s:写入数据存放的位置 返回值: 成功:非负数失败:返回EOF,并返回错误码

函数——fead()

#include <stdio.h>size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);功能: 在相应的流中读取一块数据 参数: ptr:读取数据存放的位置 size:读取一次要读取多少字节? nmemb:运行一次函数,读取多少次数据stream:流 返回值: 成功返回读到的次数 失败返回0

函数——fwrite()

#include <stdio.h>size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);功能: 往相应的流中写入一块数据 参数: ptr:写入数据存放的位置 size:写入一次要写多少字节? nmemb:运行一次函数,写入多少次数据stream:流 返回值: 成功返回写入的次数 失败返回0

函数——fclose()

#include <stdio.h>int fclose(FILE *stream);功能: 关闭相应的流参数: stream:流返回值:成功:0失败:EOF,并返回错误码

标准IO的其他适用函数:

函数——标准IO的移动光标一系列函数

ftell();fseek();-----*rewind();#include <stdio.h>long ftell(FILE *stream);//获取光标当前位置void rewind(FILE *stream);//将光标移动回文件头部int fseek(FILE *stream, long offset, int whence);功能: 根据参数的信息,相应的移动光标参数: stream:流 offset:偏移量whence:基准位置: SEEK_SET:文件头部 SEEK_CUR:光标当前位置 SEEK_END:文件末尾返回值: 成功返回0 失败返回-1.并设置错误码

三、文件IO

1、概念:

1>只要输入输出就必定系统调用

2>没有缓冲区,数据都是直接输入输出的

3>核心是文件描述符----系统一部分

4>由系统底层提供 --POSIX

5>应用场景广,有系统的地方,就可以使用文件IO

2、文件描述符

对于内核而言,所有已打开的文件,都由文件描述符引用/标识。我们绝大部分的函数操作,都是操作文件描述符,并非文件本体,文件描述符是一个非负整数。

3、文件IO的API学习:

文件io—函数概要

一、打开文件

二、操作文件

四、时间编程

1.概念

我们需要在编程的时候,获取系统的标准时间

系统的标准时间:1970年1月1日凌晨0时0分0秒 到 此时此刻的秒数

2.时间编程的API:

时间编程—函数概要

(1)获取系统标准时间

time_t time(time_t *tloc);

(2)将标准时间转换为字符串时间

char *ctime(const time_t *timep);

(3)将标准时间转化为本地时间---自定义

struct tm *localtime(const time_t *timep);

(4)将本地时间转换为字符串时间

char *asctime(const struct tm *tm);

函数——time

#include <time.h>time_t time(time_t *tloc);功能: 获取系统的标准时间 参数: tloc:保存秒数的变量地址 返回值: 成功返回获取到的秒数 失败返回-1

函数——ctime

#include <time.h>char *ctime(const time_t *timep);功能: 将标准时间转换为字符串时间 参数: timep:以秒为单位的变量地址 返回值: 成功返回字符串时间 失败返回NULL

函数——localtime

#include <time.h>struct tm *localtime(const time_t *timep);功能; 将标准时间转化为本地时间 参数: timep:以秒为单位的变量地址 返回值: 成功返回:结构体指针 失败返回:NULL struct tm {int tm_sec; /* Seconds (0-60) */秒数 int tm_min; /* Minutes (0-59) */分钟int tm_hour; /* Hours (0-23) */小时int tm_mday; /* Day of the month (1-31) */月中天数int tm_mon; /* Month (0-11) */月份 因为取值是0-11,所以使用时+1int tm_year; /* Year - 1900 */年份 +1900int tm_wday; /* Day of the week (0-6, Sunday = 0) */周几int tm_yday; /* Day in the year (0-365, 1 Jan = 0) */一年中的第几天int tm_isdst; /* Daylight saving time */夏令时};

函数——asctime

#include <time.h>char *asctime(const struct tm *tm);功能; 本地时间转换为字符串时间参数: tm:结构体指针 返回值: 成功返回:表示时间的字符串 失败返回:NULL

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。