首页 > 系统相关 >Unix/Linux系统编程学习笔记二

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

时间:2023-09-17 12:44:06浏览次数:74  
标签:fp 文件 调用 int 编程 char Unix FILE 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库函数的作用的理解是否正确

三、代码运用练习

静态库:

动态库:

 

 

标签:fp,文件,调用,int,编程,char,Unix,FILE,Linux
From: https://www.cnblogs.com/llwwjj/p/17708307.html

相关文章

  • Linux Shell脚本实战:让你的工作变得更轻松、更高效
    作为一名Linux工程师,会写好的脚本不仅能提高工作效率,还能有更多的时间做自己的事。最近在网上冲浪的时候,也注意收集一些大佬写过的脚本,汇总整理一下,欢迎收藏,与君共勉!查看有多少远程的IP在连接本机#!/bin/bash#!/bin/bash#查看有多少远程的IP在连接本机(不管是通过ssh......
  • 系统内存管理:虚拟内存、内存分段与分页、页表缓存TLB以及Linux内存管理
    虚拟内存虚拟内存是一种操作系统提供的机制,用于将每个进程分配的独立的虚拟地址空间映射到实际的物理内存地址空间上。通过使用虚拟内存,操作系统可以有效地解决多个应用程序直接操作物理内存可能引发的冲突问题。在使用虚拟内存的情况下,每个进程都有自己的独立的虚拟地址空间,它们......
  • 《深入LINUX内核架构》学习笔记 ——01
    模块相关的知识1.模块相较于宏内核(微内核优点)模块消除了宏内核的许多限制,包括:缺乏动态可拓展性、导致内核映像尺寸膨胀、测试新特性时必须重启系统等。2.静态链接、动态链接及模块依赖(TIPS)《深入理解计算机系统》中有这样一段话:共享库是一个目标模块,在运行或加......
  • Win32编程之文件设备(九)
    一、文件的创建CreateFile是一个WindowsAPI函数,用于创建或打开文件、设备、目录或管道。它是Windows操作系统中文件和I/O操作的基础之一。CreateFile允许你指定文件的访问方式、共享模式、创建选项等,并返回一个文件句柄,通过该句柄可以执行读取、写入、关闭等操作。以下......
  • goland dlv在远程linux里运行代码开发,并debug调适
    一、配置好ssh自动同步代码参考下面连接:https://www.cnblogs.com/haima/p/13257524.html二、配置devbug监听运行GORemote填写配置linux上运行监听服务如:上图有两种方式直接运行代码并监听dlvdebug--headless--listen=:12345--api-version=2--accept-multiclie......
  • 前端开发的未来:Web组件化与可视化编程探索
    随着互联网的快速发展,前端开发领域也日新月异。为了满足越来越多复杂的需求和提高开发效率,前端开发不断演进。本文将深入探讨前端开发的未来,重点关注Web组件化和可视化编程,这两个领域有望改变前端开发的方式。1.Web组件化的兴起Web组件化是前端开发的一个重要趋势,它旨在将Web应......
  • IFAction导出的游戏如何在linux程序下运行?
    在linux系统里,应该都自带python环境,把游戏以web方式导出,在文件夹下创建一个python文件(文件后缀以.py结束),把以下代码复制进去,#author:rkey#date:20230904#note:用于解决IFAction导出的web版游戏在linux系统下运行的问题。importtkinterastkfromthreadingimportThrea......
  • linux安装nacos
    linux安装nacos1、jdk安装1.1、准备jdk1.8安装包1.2、解压JDK安装包1.3、配置JDK变量环境1.4、刷新环境变量使其生效1.5、查看JDK是否安装成功2、安装maven2.1、首先到maven官网下载maven压缩包2.2、将下载的压缩包上传到linux的/usr/local目录2.3、解压文件2.4、配置环境变量2.5、......
  • vue--day86--编程式路由导航
    1.作用:不借助```<router-link>```实现路由跳转,让路由跳转更加灵活 2.具体编码:   ```js  //$router的两个API  this.$router.push({  name:'xiangqing',  params:{  id:xxx,  title:xxx  }  })    this.$router.re......
  • linux-管道符、重定向
    1、管道符   命令1|命令2   命令1的正确输出作为命令2的操作对象   如:查看xx.txt文件并且查找123字符      catxx.txt|grep"123"; 2、重定向     ......