读书笔记之C Primer Plus 6

news/2024/4/24 12:11:48/文章来源:https://blog.csdn.net/yuoveyu/article/details/128089281

为什么阅读《C Primer Plus》第六版

准备好好研究下redis源码,但是很久没用c语言写代码了,平时工作主要用java和js。
所以准备重新阅读学习下c语言经典书籍:C Primer Plus。
更好地阅读redis源码。


第13章 文件输入/输出

文件是当今计算机系统不可或缺的部分。文件用于存储程序、文档、数据、书信、表格、图形、照片、视频和许多其他种类的信息。

什么是文件

文件通常是在磁盘或固体硬盘上的一段已命名的存储区。
C提供两种文件模式:文本模式和二进制模式。

文本模式和二进制模式

所有文件的内容都以二进制形式存储。

  • 文本模式:如果文件最初使用二进制编码的字符(ASCII或Unicode)表示文本,该文件就是文本文件。
  • 二进制模式:如果文件中的二进制值代表机器语言代码或数值数据或图片或音乐编码,该文件就是二进制文件。
  • 在二进制模式中,程序可以访问文件的每个字节。
  • 在文本模式中,程序所见的内容和文件的实际内容不同。
  • 程序以文本模式读取文件时,把本地环境表示的行末尾或文件结尾映射为C模式。(比如\r转换成\n)
  • 除了以文本模式读写文本文件,还能以二进制模式读写文本文件

I/O的级别

  • 底层I/O(low-level I/O)使用操作系统提供的基本I/O服务
  • 标准高级I/O(standard high-level I/O)使用C库的标准包和stdio.h头文件定义
  • 标准高级I/Os比底层I/O容易跨平台移植。标准io使用缓冲区,底层io需要自己处理缓存。

标准文件

C程序会自动打开3个文件,它们被称为标准输入(standard input)、标准输出(standard output)和标准错误输出(standard error output)。
在默认情况下,标准输入是系统的普通输入设备,通常为键盘;标准输出和标准错误输出是系统的普通输出设备,通常为显示屏。

标准I/O

/* count.c -- 使用标准 I/O */
#include <stdio.h>
#include <stdlib.h>    // 提供 exit()的原型int main(int argc, char *argv [])
{int ch;          // 读取文件时,存储每个字符的地方FILE *fp;        // “文件指针”unsigned long count = 0;if (argc != 2){printf("Usage: %s filename\n", argv[0]);exit(EXIT_FAILURE);}if ((fp = fopen(argv[1], "r")) == NULL){printf("Can't open %s\n", argv[1]);exit(EXIT_FAILURE);}while ((ch = getc(fp)) != EOF){putc(ch, stdout);    // 与 putchar(ch); 相同count++;}fclose(fp);printf("File %s has %lu characters\n", argv[1], count);return 0;
}
  • return 0 和 exit 区别。

fopen函数

  • 函数声明在stdio.h中
  • 第一个参数:打开文件的包含该文件名的字符串地址。
  • 第二个参数:打开文件的模式,r=读模式,w=写模式
  • x模式:x模式的独占特性使得其他程序或线程无法访问正在被打开的文件
  • 成功打开文件后,fopen()将返回文件指针。
  • 文件指针不指向实际的文件,它指向一个包含文件信息的数据对象,其中有缓冲区信息。

getc和putc

  • ch = getchar(); 从标准输入中获取一个字符;
  • ch = getc(fp); 从fp指向的文件中获取一个字符;
  • putc(ch,fpout); 把字符ch放入FILE指针fpout指定的文件中;
  • 都定义在stdio.h中

文件结尾

返回一个特殊值EOF代表文件末尾

int ch;
FILE * fp;
fp = fopen("wacky.txt", "r");
while (( ch = getc(fp)) != EOF)
{putchar(ch);    //处理输入
}

fclose函数

  • 成功返回0
  • 失败返回EOF
  • 磁盘已满、移动磁盘移除或出现io错误,都会失败
if (fclose(fp) != 0)printf("Error in closing file %s\n", argv[1]);

指向标准文件的指针

stdio.h头文件把3个文件指针与3个标准文件相关联,C程序会自动打开这3个标准文件。

  • 标准输入 stdin
  • 标准输出 stdout
  • 标准错误 stderr

fprintf和fscanf

文件I/O函数fprintf()和fscanf()函数的工作方式与printf()和scanf()类似,区别在于前者需要用第1个参数指定待处理的文件。
都把FILE指针作为第一个参数,而不是最后一个参数。

fprintf(fp,"%s\n",words);
fscanf(fp,"%s",words);

fgets和fputs

  • fgets第一个参数表示存储输入位置的地址(char* 类型);
  • fgets第二个参数事一个整数,待输入字符串的大小;
  • fgets第三个参数是文件指针;
  • fgets(buf,STLEN,fp);
  • fgets读取输入直到第一个换行符的后面,或读到文件结尾,或者读取STLEN-1个字符;
  • 然后fgets在末尾添加一个空字符使之成为一个字符串;
  • fputs第一个参数是字符串的地址;
  • fputs第二个参数事文件指针;
  • 由于fgets保留了换行符,fputs就不会再添加换行符;

随机访问fseek和ftell

  • fseek第一个参数是FILE指针,fopen返回的文件指针
  • fseek第二个参数是编移量,必须是long类型的值,正(前移),负(后移)或0(保持不动)
  • fseek第三个参数事模式,该参数确定起始点,
  • stdio.h常量-> SEEK_SET文件开始处、SEEK_CUR当前闻之、SEEK_END文件末尾,旧的实现对应0L、1L、2L
  • ftell函数返回类型long,返回指向文件的当前位置距文件开始处的字节数;
  • last = ftell(fp);
fseek(fp,0L,SEEK_SET); //定位至文件开始处
fseek(fp,10L,SEEK_SET);//定位至文件中的第10个字符
fssek(fp,2L,SEEK_CUR);//从文件当前位置前移2个字节
fseek(fp,0L,SEEK_END);//定位至文件结尾
fseek(fp,-10L,SEEK_END);//从文件结尾处回退10个字节;

fgetpos和fsetpos

  • 不使用long类型,使用新类型:fpos_t文件定位类型
//调用该函数时,它把fpos_t类型的值放在pos指向的位置上,该值描述了文件中的当前位置距文件开头的字节数。如果成功,fgetpos()函数返回0;如果失败,返回非0。
int fgetpos(FILE * restrict stream,fpos_t * restrict pos);
//调用该函数时,使用pos指向位置上的fpos_t类型值来设置文件指针指向偏移该值后指定的位置。如果成功,fsetpos()函数返回0;如果失败,则返回非0。fpos_t类型的值应通过之前调用fgetpos()获得。
int fsetpos(FILE *stream,const fpos_t *pos);

int ungetc(int c, FILE *fp)函数

int ungetc()函数把c指定的字符放回输入流中。

int fflush()函数

int fflush()函数

调用fflush()函数引起输出缓冲区中所有的未写入数据被发送到fp指定的输出文件。这个过程称为刷新缓冲区。

int setvbuf()函数

int setvbuf(FILE * restrict fp, char * restrict buf, int mode, size_t size);

setvbuf()函数创建了一个供标准I/O函数替换使用的缓冲区。在打开文件后且未对流进行其他操作之前,调用该函数。指针fp识别待处理的流,buf指向待使用的存储区。

fwrite和fread

  • fwrite把二进制数据写入文件
  • fwrite返回size_t类型
  • fread()函数接受的参数和fwrite()函数相同。
  • 在fread()函数中,ptr是待读取文件数据在内存中的地址,fp指定待读取的文件。
size_t fwrite(const void * restrict ptr, size_t size, size_t nmemb,FILE * restrict fp);
size_t fread(void * restrict ptr, size_t size, size_t nmemb,FILE * restrict fp);

读书总结

这章仔仔细细看了两遍,对c的标准I/O有了清晰的认识,不像java的IO这么多。java的io虽然灵活,但略显繁琐。

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

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

相关文章

Apifox:成熟的测试工具要学会自己写接口文档

好家伙&#xff0c; 在开发过程中&#xff0c;我们总是避免不了进行接口的测试&#xff0c; 而相比手动敲测试代码&#xff0c;使用测试工具进行测试更为便捷&#xff0c;高效 今天发现了一个非常好用的接口测试工具Apifox 相比于Postman&#xff0c;他还拥有一个非常nb的功…

【毕业设计】26-基于单片机心跳体温血压系统仿真设计(原理图+仿真+演示视频+论文)

【毕业设计】基于单片机心跳体温血压系统仿真设计&#xff08;原理图仿真演示视频论文&#xff09; 文章目录【毕业设计】基于单片机心跳体温血压系统仿真设计&#xff08;原理图仿真演示视频论文&#xff09;任务书设计说明书摘要设计说明书及设计文件任务书 以单片机为控制核…

【虚幻引擎UE】UE5 材质动态修改的2种方法(含工程源码)

演示效果&#xff1a; 示例工程源码 一、直接材质参数变量 1、贴图变量&#xff1a; 在材质蓝图中右键&#xff0c;创建变量TextureSampeParameter2D&#xff08;贴图变量&#xff09;。 输入RGB到基础颜色 2、单色变量&#xff1a; 在材质蓝图中右键&#xff0c;创建变量…

牛顿法,高斯牛顿法,列文伯格-马夸尔特(LM)法

文章目录一&#xff1a;牛顿法 &#xff08;Newtons method&#xff09;1&#xff1a;概述2&#xff1a;牛顿方向与牛顿法3&#xff1a;牛顿法的基本步骤4&#xff1a;举例二&#xff1a;高斯牛顿法 &#xff08;Gauss–Newton algorithm&#xff09;1&#xff1a;概述2&#x…

Metabase学习教程:仪表盘-5

SQL查询仪表盘添加筛选器 如何将过滤器小部件添加到仪表盘&#xff0c;并将它们连接到多个SQL查询中的字段过滤器变量。 本文介绍如何创建仪表盘小工具到过滤器数据输入SQL查询。图1显示了我们将要构建的仪表盘&#xff1a; 图1。我们将要构建的&#xff1a;一个仪表盘&#…

在el-table表头上引入组件不能实时传参bug

文章目录场景还原解决方法出现原因场景还原 产品要求&#xff1a;点击表格的表头&#xff0c;能触发一个下拉的列表&#xff0c;列表能携带表格的筛选条件&#xff0c;获取相应的数据 写了一个demo&#xff0c;来还原一下bug出现的场景&#xff1a; <div id"demo&qu…

分省/市政府性债务数据财政收支数据财政透明度

&#xff08;1&#xff09;30省地方政府债务面板数据 1、数据来源&#xff1a;自身 2、时间跨度&#xff1a;2012-2018年 3、区域范围&#xff1a;全国30各省&#xff08;西藏除外&#xff09; 4、指标说明&#xff1a; 部分指标如下&#xff1a; 负债率&#xff08;地方…

【性能|优化】TB级flink任务报错分析:Could not compute the container Resource

文章目录一. 问题引入1. 场景描述2. 日志简析二. 初级问题分析与解决1. 问题分析1.1. yarn的调度器设置1.2. 程序设置2. 问题解决三. &#xff08;性能&#xff09;新的问题1. 问题描述2. 理想化的最优方案3. "PlanB"的解决方案四. 反思与迭代一. 问题引入 1. 场景描…

Focal Self-attention for Local-Global Interactions in Vision Transformers

目录 Abstract 1. Introduction 2. MEthod 2.1 Model architecture 2.2 Focal self-attention 2.2.1 Window-wise attention 2.2.2 Complexity analysis 2.3 Model configuration 3. Related work 4. Experiments 4.1 Image classification on ImageNet-1K 4.…

xss-labs/level7

我们如同一下构造那样 <script>alert(xss)</script> 产生以下回显 接着查看源代码 发现第一个输出点被转义了 没有利用价值了 第二个输出点则是可以发现script关键字直接给干没了 氧化钙!!! 似此 如何处之&#xff1f; 我们猜测后台服务器还是对一些特殊字符进…

hiveSql 相互关注问题

hiveSql 相互关注问题说明需求分析优化实现最后说明 普遍社交软件上会有关注功能&#xff0c;如何知道自己的关注是否也是关注了自己呢&#xff1f; 需求 求关注结果数据中&#xff0c;相互关注的用户对。 数据如下&#xff1a; follow表&#xff1b;from_user&#xff1a;关…

人才资源开发杂志人才资源开发杂志社人才资源开发编辑部2022年第21期目录

开卷有益《人才资源开发》投稿&#xff1a;cnqikantg126.com 年轻干部要走好成长成才之路 赖宁; 1 特别关注 迎难而上 勇担重任 推进河南人事考试高质量发展 常万琦; 6-7 工作要闻 第五届中国河南招才引智创新发展大会开幕 归欣 ;张笑闻; 8 河南省12家企业和2个…

Playwright 简明入门教程:录制自动化测试用例,结合 Docker 使用

本篇文章聊聊如何使用 Playwright 进行测试用例的录制生成&#xff0c;以及如何在Docker 容器运行测试用例&#xff0c;或许是网上最简单的入门教程。 写在前面 Playwright 是微软出品的 Web 自动化测试工具和框架&#xff0c;和 Google Puppeteer 有着千丝万缕的关系。前一阵…

电脑密码忘了怎么解除?最简单操作的方法

可能很多人都遇到过这种情况&#xff1a;忘记了电脑密码。电脑密码忘了怎么解除&#xff1f;大多数人都不知道如何解决。下面就为大家分享一下电脑密码忘记怎么解决的方法&#xff0c;方法主要分为两种情况&#xff1a;一种情况是&#xff0c;电脑开机下忘记密码&#xff1b;另…

Cpp知识点系列-类型转换

前言 在做题的时候发现了需要用到类型转换&#xff0c;于是在这里进行了简单的记录。 历史原因&#xff0c;慢慢整理着发现类型转换也能写老大一篇文章了。又花了时间来梳理一下就成了本文了。 cpp 之前使用的环境是DEV-C 5.4&#xff0c;而对应的GCC版本太低了。支持c11需要…

智慧环卫管理系统解决方案(垃圾分类)

1.1 垃圾分类管理子系统 1.1.1 公众参与互动平台 可为客户量身打造微信公众号&#xff0c;搭建互动交流的平台&#xff0c;更好的调动居民参与垃圾分类的热情。 1.1.1.1 分类指导 将目前城市的垃圾处理情况、垃圾分类现状、分类的意义&#xff0c;以数据来说明垃圾分类的…

【设计】OOA、OOD、OOP

这三者都是 OO&#xff08;Object-Oriented&#xff09;领域的思想。 一般我们我们接到产品经理的需求后&#xff0c;开发阶段分这样几个步骤&#xff1a; 可行性预研阶段&#xff0c;此阶段评估需求是否合理&#xff0c;能否实现&#xff1b;OOA阶段&#xff0c;此阶段分析用…

语文课内外杂志语文课内外杂志社语文课内外杂志社2022年第14期目录

幼儿教育《语文课内外》投稿&#xff1a;cn7kantougao163.com 家园协同视域下幼儿心理危机的预防与干预对策 曹锭1-3 幼小衔接阶段幼儿时间观念的培养对策 陈晶晶4-6 有效支持 助力幼儿在书海中徜徉 胡玲珊7-9 东西部幼儿园结对帮扶,助力乡村教育扶贫——以广州市人民政府机关幼…

多线程(2)

文章目录前言 &#xff1a;1.Thread类 &#xff1a;1.1 Thread类常见的构造方法1.2 Thread的几个常见属性1.3 中断一个线程1.4 等待一个线程-join()1.5 获取当前线程引用1.6 休眠当前线程2.线程状态前言 &#xff1a; 简单回顾上文知识点 上文我们了解了 线程是为解决并发编程引…

Java数据审计工具:Envers and JaVers比较

在Java世界中&#xff0c;有两种数据审计工具&#xff1a;Envers和JaVers。 Envers已经存在了很长时间&#xff0c;它被认为是主流。 JaVers提供全新的方法和技术独立性。 如果您考虑哪种工具更适合您的项目&#xff0c;本文是一个很好的起点。 本文分为三个部分。首先&#x…