目录
一、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