学习笔记二
一、教材知识点总结
1. I/O库函数程序
(1)fopen()使用字符串表示模式,其中"r"表示READ"w"表示WRITE。它返回一个指向FILE结构体的指针。fopen()首先发出open()系统调用来打开文件,以获取文件描述符编号fd。如果open0系统调用失败,则fopen()会返回一个NULL指针。否则,它会在程序的堆区中分配一个FILE结构体。每个FILE结构体均包含一个内部缓冲区fbufBLKSIZE],其大小通常与文件系统的BLKSIZE相匹配。此外,它还包含用于操作fbufT的指针、计数器和状态变量,存储来自open0的文件描述符。它将FILE结构体初始化并返回指向FILE结构体的p。需要注意的是,FILE结构体位于进程的用户模式映像中。这意味着对I/O库函数的调用是普通的函数调用,而不是系统调用。
(2)如有任何 fopen()调用失败,程序将会终止。如前文所述,fopen0在失败时会返回一个NULL指针,例如,文件不能在指定模式下打开时。
(3)然后,它使用一个 while循环来复制文件内容。while 循环的每个选代尝试从源文件读取BLKSIZE字节,并向目标文件写入n个字节,其中n是从fread0返回的值fread0和fwrite0的一般形式是:
int n = fread(buffer, size, nitems, FILEptr);
int n = fwrite(buffer,size, nitems, FILEptr);
其中size是记录大小(以字节为单位)nitems是要读取或写人的记录数量,n实际读取或写入的记录数量。这些函数用于读/写结构化数据对象。
2. I/O库函数算法
(1)fread算法
①在第一次调用fread0时,FILE结构体的缓冲区是空的ead0使用保存的文件描述符q发出一个n = read(fd,fbuffer, BLKSIZE);
系统调用,用数据块填充内部的fbuf[]。
②在随后的每次fread()调用中,它都尝试满足来自FILE结构体内部缓冲区的调用当缓冲区变为空时,它就会发出read()系统调用来重新填充内部缓冲区。
(2)fwrite算法
fwrite()算法与fread()算法相似,只是数据传输方向不同。最开始,FILE结构体的内部缓冲区是空的。
(3)fclose算法
若文件以写的方式被打开,fclose0)会先关闭文件流的局部缓冲区。然后,它会发出一个close(fd)系统调用来关闭FILE结构体中的文件描述符。最后它会释放FILE结构体并将FILE指针重置为NULL。
3. I/O库模式
fopen()中的模式参数可以指定为:"r"、"w"、"a",分别代表读、写、追加。
每个模式字符串可包含一个+号,表示同时读写,或者在写人、追加情况下,如果文件不存在则创建文件。
"r+":表示读/写,不会截断文件。
"w+":表示读/写,但是会先截断文件;如果文件不存在,会创建文件。
"a+":表示通过追加进行读/写:如果文件不存在,会创建文件。
4. 字符模式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 fputc(int c,FILE *fp); // put a char to fp
5. 行模式I/O
char *fgets(char *buf,int size,FILE *fp)
:从p中读取最多为一行(以结尾)的字符。
int fputs(char *buf,FILE *fp)
:将buf中的一行写人p中。
6. 格式化I/O
格式化输入:(FMT=格式字符串)
scanf(char *FMT,&items); // from stdin
fscanf(fp,char *FMT,&items); // from file stream
格式化输出:
printf(char *FMT,items); // to stdout
fprintf(fp,char *FMT,items); // to file stream
7. I/O库函数
-
fseek()、ftell()、rewind():更改文件流中的读/写字节位置。
-
feof()、ferr()、fileno():测试文件流状态。
-
fdopen():用文件描述符打开文件流。
-
freopen():以新名称重新打开现有的流。
-
setbuf()、setvbuf():设置缓冲方案。
-
popen():创建管道,复刻子进程来调用sh。
二、利用chatgpt
1. I/O库函数和系统调用之间的相似性和基本区别
2. fseek()、ftell()、rewind()指令有何区别
3. feof()、ferr()、fileno()指令有何区别
4.我对于I/O库函数的作用的理解是否正确
三、代码运用练习
静态库:
动态库:
标签:fp,文件,调用,int,编程,char,Unix,FILE,Linux From: https://www.cnblogs.com/llwwjj/p/17708307.html