目录
1.2 sprintf/snprintf/fprintf函数
前言
从这一周开始学习的课程是IO进程,为时八天;本周的周一是数据结构的考试,考试的总结写在了上一周的末尾;从周二到周五这四天的时间里,主要学习了:文件IO、标准IO、库和多进程。
老师说从IO进程开始,课程就从基础阶段拔高到应用层面了,经过这四天的学习下来,主要感觉就是:内容多、代码量大、要熟悉和记忆的内容多、易混淆的知识点多。比较重要的内容还是标准IO和文件IO里的海量的函数接口,因此,本次的反思将针对这几方面,进行整理归纳,难点分析和易混淆点辨析。
同样,写此文章,是想以这种碎碎念的方式回顾重点、重复盲点、加深印象,复习、总结和反思本周的学习,仅供后期自己回顾使用。知识体系不完善,内容也不详细,仅供笔者复习使用。如果是有需要笔记,或者对这方面感兴趣,可以私信我,发你完整的知识体系和详细内容的笔记。如有任何错误请多指正,也欢迎友好交流,定会虚心听取大佬的宝贵意见!
周二
IO简介和标准IO
一、IO简介
1.1 什么是IO
IO(input&output)是用户空间和内核空间通过API进行的交互。
1.2 IO的分类
IO分为:标准IO和文件IO
标准IO:库函数
文件IO:系统调用
1.3 什么是系统调用和和库函数
系统调用:系统调用是用户空间进入内核空间的一次过程。
优点:操作系统不同,系统调用的函数接口也不同,因此系统调用的移植性比较差。
缺点:系统调用没有缓冲区,所以效率比较低。
库函数:库函数 = 系统调用 + 缓冲区
优点:库函数要比系统调用的效率高。
缺点:库函数的接口比较统一,移植性比较强。
区别辨析:系统调用对内核的访问是即时的,库函数的缓冲区需要刷新才能访问内核。
1.4 什么是IO接口
IO接口就是函数调用,系统已经封装好,使用时直接调用。
例如:
标准IO:fopen fread fwrite fputc fgetc fputs fgets fclose printf scanf...
文件IO:open read write close...
二、标准IO
标准IO:库函数 = 系统调用 + 缓冲区
标准IO:fopen fread fwrite fputc fgetc fputs fgets fclose printf scanf...
FILE结构体:
FILE本身是一个结构体,在调用fopen的时候产生一个结构体指针,这个FILE结构体,就代表打开文件的所有的信息(例如缓冲区的大小,光标的位置等信息),并且以后在读写文件的时候通过FILE指针完成。
在一个正在执行的程序中,默认已经有了三个FILE指针:stdin、stdout、stderr;
它们分别代表的是标准输入,标准输出,标准出错。
typedef struct _IO_FILE FILE;
struct _IO_FILE {
char* _IO_buf_base; //缓冲区的起始地址
char* _IO_buf_end; //缓冲区的结束地址
...
}
2.1 fopen/fclose函数
#include <stdio.h>
FILE *fopen(const char *pathname, const char *mode);
功能:使用标准IO接口打开文件
参数:
@pathname:想要打开文件的路径及名字 "/home/linux/1.c"
@mode :打开文件的方式 "r" "r+" "w" "w+" "a" "a+"
r :以只读的方式打开文件,将光标定位到文件的开头
r+ :以读写的方式打开文件,将光标定位到文件的开头
w :以只写的方式打开文件,如果文件存在就清空文件,如果文件不存在就创建文件
w+ :以读写的方式打开文件,如果文件存在就清空文件,如果文件不存在就创建文件
a :以追加的方式打开文件,如果文件不存在就创建文件,如果文件存在光标定位到结尾进行写
a+ :以读和追加的方式打开文件,如果文件不存在就创建文件,如果进行读从开头读,如果写
在结尾写。
返回值:成功返回FILE指针,失败返回NULL,置位错误码
int fclose(FILE *stream);
功能:关闭文件
参数:
@stream:文件指针
返回值:成功返回0,失败返回EOF(-1),置位错误码
实例:
#include <stdio.h> int main(int argc,const char * argv[]) { FILE *fp; if((fp = fopen("./hello.txt","w")) == NULL){ printf("fopen file error\n"); return -1; } //有一个fopen就要对应一个fclose if(fclose(fp)){ printf("fclose file error\n"); return -1; } return 0; }
2.1 strerror函数
#include <string.h>
char *strerror(int errnum);
功能:将错误码转换为错误信息的字符串
参数:
@errnum:错误码
返回值:错误信息的字符串
实例:
#include <stdio.h> #include <errno.h> #include <string.h> int main(int argc,const char * argv[]) { FILE *fp; if((fp = fopen("./hello.txt","r")) == NULL){ printf("fopen file error\n"); printf("errno = %d,%s\n",errno,strerror(errno)); return -1; } return 0; }
2.3 perror函数
#include <stdio.h>
void perror(const char *s);
功能:将错误信息打印到终端上
参数:
@s:用户的附加信息
返回值:无
实例:
注意perror打印时会在结尾部冒号。
#include <stdio.h> int main(int argc,const char * argv[]) { FILE *fp; if((fp = fopen("./hello.txt","r")) == NULL){ perror("fopen file error"); return -1; } return 0; }
2.4 fputc/fgetc函数
put是往文件中写,get是从文件中读;
#include <stdio.h>
int fputc(int c, FILE *stream);
功能:向文件中写入字符
参数:
@c:字符的ascii
@stream:文件指针
返回值:成功返回字符ascii值,失败返回EOF(-1)
int fgetc(FILE *stream);
功能:从文件中读取字符
参数:
@stream:文件指针
返回值:成功读取到的字符的ascii,读取到文件结尾或者出错,返回EOF(-1)
fputc实例
#include <stdio.h> int main(int argc, const char* argv[]) { FILE* fp; //以只写的方式打开文件,如果文件不存在就创建文件,如果文件存在就清空文件 if ((fp = fopen("./hello.txt", "w")) == NULL) { perror("fopen file error"); return -1; } fputc('h', fp); //将h字符写入到文件中,同时光标会向后移动一个字符的位置 fputc('e', fp); //将e字符写入到文件中,同时光标会向后移动一个字符的位置 fputc('l', fp); fputc('l', fp); fputc('o', fp); fclose(fp); return 0; }
#include <stdio.h> int main(int argc, const char* argv[]) { FILE* fp; //以只写的方式打开文件,如果文件不存在就创建文件,如果文件存在就清空文件 if ((fp = fopen("./hello.txt", "w")) == NULL) { perr