linux系统编程第九章

目录

1.I/O库函数

I/O函数是一系列文件操作函数,既方便用户使用,又提高了整体效率(GNU i/O on streams 2017;GNU libc 2017;GNU library Reference Manual 2017)。

2.I/O库函数与系统调用

系统调用函数:open()、read()、write()、lseek()、close()
I/O库函数:fopen()、fread()、fwrite()、fseek()、fclose()
其中,fopen()依赖于open(),fread()依赖于read(),等等。

3.I/O库函数的算法

3.1fread算法

fread()一面接收来自用户程序的调用,一面面向操作系统内核发出read()系统调用。

3.2fwrite算法

与fread算法类似,但传输方式不同。结构体缓冲区为空,调用fwrite()时,将数据写入内部缓冲区,调整缓冲区指针、计数器、状态变量,跟踪缓冲区字节数。若结构体缓冲区已满,发出write()系统调用,将整个缓冲区写入操作系统内核。

3.3fclose算法

文件以写的方式打开,fclose()先关闭文件流的局部缓冲区,发出close(fd)系统调用来关闭FILE结构体中文件描述符,最终释放结构体,重置指针为NULL。

4.I/O库模式

fopen()中的模式参数可以指定为:“r”、“w”、“a”,分别代表读、写、追加。
每个模式字符串可包含一个“+”表示同时读写,或者在写入、追加情况下,如果文件不存在则会创建文件。
“r+”:表示读/写,不会截断文件。
“w+”:表示读/写,但是会先截断文件;如果文件不存在,会创建文件。
“a+”:表示通过追加进行读/写;如果文件不存在,会创建文件。

4.1字符模式

int fgetc(FILE *fp);
int ungetc(int c,FILE *fp);
int fputc(int c,FILE *fp);
注意,fgetc()返回的是整数,而不是字符。这是因为它必须在文件结束时返回文件结束符。文件结束符通常是一个整数-1,将它与文件流中的任何字符区分开。
对于fp=stdin或stdout,可能会使用c=getchar() ; putchar(c);来代替。对于运行时效来说,getchar() 和putchar() 通常不是getc() 和 putc()的缩小版本。相反,可以将它们实现为宏,以避免额外的函数调用。

4.2行模式I/O

char *fgets(char *buf, int size, FILE *fp):从fp中读取最多为一行(以\n结尾)的字符
int fputs(char *buf, FILE *fp):将buf中的一行写入fp中

4.3其他I/O库函数

fseek()、ftell()、rewind():更改文件流中的读/写字节位置
feof()、ferr()、fileno():测试文件流状态
fdopen():用文件描述符打开文件流
freopen():以新名称重新打开现有的流
setbuf()、setvbuf():设置缓冲方案
popen():创建管道,复刻子进程来调用sh

4.4限制混合fread-fwrite

规范要求每对fread()和fwrite()之间至少有一个fseek()或ftell()。

5.文件流缓冲

无缓冲:从非缓冲流中写入或读取的字符将尽快单独传输到文件或从文件中传输。例如,文件流stderr通常无缓冲。到stderr的所有输出都会立即发出。
行缓冲:遇到换行符时,写入行缓冲流的字符以块的形式传输。例如,文件流stdout通常是行缓冲,逐行输出数据。
全缓冲:写入全缓冲流或从中读取的字符以块大小传输到文件或从文件传输。这是文件流的正常缓冲方案。
通过fopen()创建文件流之后,在对其执行任何操作之前,用户均可发出一个setvbuf(FILE *stream, char *buf, int node, int size)调用来设置缓冲区(buf)、缓冲区大小(size)和缓冲方案(mode),它们必须是以下一个宏:
_IONBUF:无缓冲。
_IOLBUF:行缓冲。
_IOFBUF:全缓冲。
对于行缓冲流或全缓冲流,可用fflush(stream)立即清除流的缓冲区。

6.变参函数

目前,C语言和C++会强制执行类型检查,但这两种语言仍然允许参数数量可变的函数。这些函数必须至少使用一个参数进行声明,后跟3个点,如int func(int m, int n...)
在函数内部,可以通过C语言库宏访问参数:void va_start(va_list ap, last)。

7.苏格拉底挑战

7.1I/O库函数算法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.2I/O库模式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8.问题与解决思路

markdow文件如何设置带有小标题的目录
在这里插入图片描述
在这里插入图片描述
argc和argv是什么
在这里插入图片描述
在这里插入图片描述
如何在Linux终端中在一个C语言文件中运行另一个C语言文件
在这里插入图片描述
在这里插入图片描述
如何在linux终端中创建头文件
在这里插入图片描述
nano如何保存并退出
在这里插入图片描述

9实践过程及截图

目的:制作一个C程序,使得能够将输入的字符存储进文件中并将文件中输入的字符打印出来。
实践过程:
使用emacs创建头文件prints.h和C语言文件doprints.c,并创建一个txt文档(图中为doprintsdata.txt)。
在这里插入图片描述
下面是C语言文件中的代码
头文件prints.h
在这里插入图片描述
doprints.c文件
在这里插入图片描述
将其与头文件一起编译之后生成可执行程序
在这里插入图片描述

实践结果:
键盘输入zzkzzk,将其存储到文件中并打印出来。
在这里插入图片描述
在这里插入图片描述

posted @ 2023-12-17 21:06  20211112周子凯  阅读(3)  评论(0编辑  收藏  举报