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

news/发布时间2024/5/19 8:16:19

学习笔记二

一、教材知识点总结

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

三、代码运用练习

静态库:

动态库:

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ulsteruni.cn/article/57652344.html

如若内容造成侵权/违法违规/事实不符,请联系编程大学网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

应用层-常见协议

应用层概述:TCP/IP模型的最高层 直接为应用程序提供网络服务 常用的应用层协议:DNS HTTP SMPT与POP3/IMAP Telnet FTP与TFTP DNS协议: DNS(Domain Name System 域名解析系统)建立IP地址与域名之间的映射关系 将域名解析为IP地址 将IP地址解析为域名DSN解析过程:主机A向D…

C++实现论文查重

软件工程 https://edu.cnblogs.com/campus/gdgy/CSGrade21-12/homework/13014作业要求 根据给出的样例进行查重,并把结果记录在PSP表格中作业目的 对查重有一定的初步了解GitHub链接 https://github.com/xingch123456789/3119000414PSP表格PSP2.1 Personal Software Process S…

查找范围动态变化

问题:查找范围在不同列,如何使用一个公式下拉完成 函数公式解决:=VLOOKUP(E3,OFFSET(AM$1:AN$17,,MATCH("高"&LEFT(B3)&"赋分",AN$1:AQ$1,)),2,)使用Offset函数,以AM1:AN17为起点,向下不偏移,向右偏移由B列最左的汉字决定。 使用Match函数,…

软件设计模式系列之七——原型模式

原型模式(Prototype Pattern)是一种创建型设计模式,其主要目的是通过复制现有对象来创建新对象,而不是使用构造函数。原型模式将对象的创建委托给原型对象,通过克隆(复制)来生成新对象,这种方式可以避免对象的重复初始化,提高性能,并使对象的创建更加灵活和动态。1 模…

document install LibreOffice_7.6.1.2 on Debian12

目录Download PackageOpen the programinstall Languare PackageUninstall LibreOffice from Debian Linux Libreoffice official website Package download address Download Package # Install the package mkdir libreoffice && cd libreoffice wget https://fastmi…