首页 > 系统相关 >linux系统编程第九章

linux系统编程第九章

时间:2023-12-17 21:13:08浏览次数:48  
标签:文件 fread 第九章 缓冲 编程 int 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,将其存储到文件中并打印出来。
在这里插入图片描述
在这里插入图片描述

标签:文件,fread,第九章,缓冲,编程,int,linux,缓冲区,库函数
From: https://www.cnblogs.com/ZZk15079494877/p/17708183.html

相关文章

  • linux的wc统计功能
    环境centos7.9介绍wc是一个在Linux中非常常用的命令,用于统计文件的行数、字符数和字节数。这个命令是"wordcount"的缩写,其功能就是计算指定文件中的字数、行数和字符数。常用例子计算文件的行数wc-lfilename计算文件的单词数。wc-wfilename计算文件的字符数......
  • 调整archlinux分区及ext4文件系统大小
    参照https://wiki.archlinuxcn.org/wiki/Parted1.防止数据丢失有重要数据的话先备份,防止系统崩了数据没了可以的话先在虚拟机练习一下2.注意点要扩展分区及其文件系统,(1)先扩展分区(2)再扩展文件系统要收缩分区及其文件系统,(1)先收缩文件系统(2)再收缩分区这样做是因......
  • linux虚拟机固定ip
    1、查看宿主机IP信息在windows宿主机上,键盘输入win+r,输出cmd,打开终端命令行:输入ipconfig/all,查看宿主机IP信息: 2、修改Linux虚拟机的配置文件Linux虚拟机上打开网络配置文件:cd/etc/sysconfig/network-scripts/viifcfg-ens33 修改配置文件,输入字母 i ,进入编辑模式,......
  • C#有望成为2023年的编程语言之王
    前言TIOBE2023年12月编程语言指数头条新闻:C#有望成为2023年的编程语言之王。TIOBE是什么?访问地址:https://www.tiobe.com/tiobe-index/TIOBE是一个编程社区指数,用于衡量不同编程语言的受欢迎程度。TIOBE指数基于全球范围内熟练工程师数量、课程和第三方供应商等多个因素进行......
  • 实验7_文件应用编程
    4.task_4 1#include<stdio.h>2#include<string.h>3#defineN1000045intmain()6{7intcount,i,t=0;8charx[N];9FILE*fp;10fp=fopen("D:\\data4.txt","r");11while(!feof(fp))......
  • Linux配置成代理服务器
    简介: 代理服务器(ProxyServer)是一种位于计算机网络中的中间服务器,它充当了客户端和目标服务器之间的中介,用于转发客户端请求并获取目标服务器的响应。代理服务器的主要功能包括以下几点:什么是代理服务器   代理服务器(ProxyServer)是一种位于计算机网络中的中间服务器,它充......
  • 记Linux跑ChatGLM2的坑及低显存解决办法
    记录一下踩过的坑…0.环境配置:全程国内网Ubuntu20.04withPython3.8andCUDA12.2RTX3060Laptop(6G)1.ChatGLM的下载:#clone仓库gitclonehttps://gitclone.com/github.com/THUDM/ChatGLM2-6BcdChatGLM2-6Bpip3install-rrequirements.txt#pip加速自行百......
  • linux 进程间通信 --- 共享内存(POSIX 版本)
    POSIX进程间通信POSIX进程间通信(InterprocessCommunication,IPC)是SystemV进程间通信的变体。它是在Solaris7发行版中引入的。与SystemV对象类似,POSIXIPC对象的属主、属主的组以及其他用户具有读取和写入权限,但是没有执行权限。POSIXIPC对象的属主无法将对象......
  • 《Java编程思想第四版》学习笔记48--关于Runnable
    现在run()位于类内,但它在init()结束以后仍处在“睡眠”状态。若按下启动按钮,线程便会用多少有些暧昧的表达方式创建(若线程尚不存在):newThread(Counter3.this);若某样东西有一个Runnable接口,实际只是意味着它有一个run()方法,但不存在与之相关的任何特殊东西——它不具有任何天......
  • linux查找文件
    linux查找文件常用的有find和whereis两种方式.find适用于复杂的查询,指定目录和文件名,通常可以找到你想要的文件.不要指定从根目录开始找,与其这样不如先推测一下这个文件可能在什么地方.whereis通常用来定位二进制文件,帮助文件,源码文件,默认情况下是在包管理......