Unix/Linux系统编程学习笔记二

学习笔记二

一、教材知识点总结

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库函数的作用的理解是否正确

三、代码运用练习

静态库:

动态库:

 

 

posted @ 2023-09-17 12:37  20211307李文婧  阅读(19)  评论(0编辑  收藏  举报