yzy第二次学习笔记
第九章
本章讨论了I/O库函数;结识了I/O库函数的作用及其对于系统调用的优势;使用示例程序来说明I/O库函数和系统调用之间的关系,并解释了他们之间的相似性和基本区别;详细介绍了IO库函数的算法,包括fread、 fwrite和fclose的算法,重点介绍了它们与read、write和close系统调用的交互;介绍了 I/O 库函数的不同模式,包括字符模式、行模式、结构化记录模式和格式化IO操作;阐述了文件流缓冲方案,并通过示例程序说明了不同缓冲方案的效果;阐释了有不同参数的函数以及如何使用stdarg宏访问参数。
系统调用是文件操作的基础,但它们至支持数据块的读/写。I/O库函数是一系列文件操作函数,既方便用户使用,又提高了整体效率。
9.2I/O库函数与系统调用
系统调用函数:open()、read()、write()、lseek()、close()
I/O库函数:fopen()、fread()、fwrite()、fseek()、fclose()
9.3I/O库函数算法
9.3.1fread算法
size_t fread(void* buff,size_t size,size_t count,FILE* stream)
作用:从文件中读入数据到指定的地址中
9.3.2fwrite算法
fwrite()函数以二进制方式向文件流中写入数据
9.3.3fclose算法
int fclose(FILE *stream)
功能:关闭一个文件流,使用fclose就可以把缓冲区内最后剩余的数据输出到磁盘文件中,并释放文件指针和有关的缓冲区
9.5I/O库模式
r :只读模式,1)文件必须存在。2)读指针指向文件开始处 3)调用write()会报错
w: 只写模式, 1)若文件不存在,创建文件。2)文件存在,清空文件。3)写指针指向文件开始处 。4)调用read()会报错
a: 追加模式(只写)1)若文件不存在,创建文件 。2)文件存在,不清空文件,而是在文件的结尾处继续写入 3)写指针直线文件结尾处 4)调用read()会报错
r+: 读写模式, 1)文件必须存在。2)打开可读写文件,读写指针均在文件头
w+: 读写模式 ,1)若文件不存在,创建文件。 2)若文件存在是可读写文件,清空文件。3)读写指针均在文件头
a+:读写模式 , 1)若文件不存在,创建文件。2)文件存在,不清空文件。3)读指针在开始位置,写指针在文件结尾位置
字符模式I/O:
int fgetc(FILE *fp); //get a char from fp, cast to int
int ungetc(int c, FILE *fp); //push a previously char got by fgetc() back to stream
int fput(int c, FILE *fp); //put a char to fp
行模式I/O:
char *fgets(char *buf,int size,FILE *fp):从fp中读取最多为一行(以\n结尾)的字符。
int fputs(char *buf,FILE *fp):将buf中的一行写入fp中。
格式化I/O:
格式化输入:(FMT=格式字符串)
scanf(char *FMT,&items);
fscanf(fp,char *FMT,&items)。
格式化输出: //这些大概是最常用的I/O函数
printf(char *FMT,items);
fprintf(fp,char *FMT,items)。
内存中的转换函数:sscanf()和sprintf
sscanf()和sprintf()并非I/O函数,而是内存中的数据转换函数。
其他I/O库函数
fseek()、ftell()、rewind():更改文件流中的读/写字节位置。
feof()、ferr()、fileno():测试文件流状态。
fdopen():用文件描述符打开文件流。
freopen():以新名称重新打开现有的流。
setbuf()、setvbuf():设置缓冲方案。
popen():创建管道,复刻子进程来调用sh。
文件流缓冲
每个文件流都有一个FILE结构体,其中包含一个内部缓冲区。对文件流进行读写需要遍历FILE结构体的内部缓冲区。文件流可以使用三种缓冲方案中的一种。
无缓冲:从非缓冲流中写入或读取的字符将尽快单独传输到文件或从文件中传输。
行缓冲:遇到换行符时,写入行缓冲流的字符以块的形式传输。
全缓冲:写入全缓冲流或从中读取的字符以块大小传输到文件或从文件传输。这是文件流的正常缓冲方案。
变参函数
目前,C语言和C++会强制执行类型检查,但这两种语言仍然允许参数数量可变的函数。这些函数必须至少使用一个参数进行声明,后跟3个点,如
int func(int m, int n ...) //n = last specified parameter
在函数内部,可以通过C语言库宏访问参数:
void va_start(va_list ap,last); // start param list from last parameter
type va_arg(va_list ap, type); // type = next parameter type
va_end(va_list ap); // clear parameter list
以下是我进行苏格拉底挑战问答的截图




问题与解决



实验代码截图(设计一个从C语言程序将文本文件的大小写转换)


浙公网安备 33010602011771号