p=(1 r) 2c语言编程,C Primer Plus(5版)第8章编程题1_文件I/O实现2

小伙伴们,对C语言编程有疑问的,可以加微信交流:poo_poo或者扫描我的头像,验证时请注明是“知友”

之前在 C Primer Plus(5版)第8章编程题1_重定向实现 - 知乎专栏 和 C Primer Plus(5版)第8章编程题1_文件I/O实现1 - 知乎专栏 这两篇文章中,如何实现统计一个文件中的字符个数,我使用了重定向技术和文件I/O函数来统计的方法。重定向技术简单,直接调用了系统的能

力,所以代码量也不多。使用fseek和ftell函数也很简单,完全使用了这两个函数的自身的能力。本文再使用第三种方法,是文件I/O函数的getc函数来实现文件字符数的统计。

一、题目描述

本题是第8章编程题的第一道题,题目如下:

image

二、题目及思路分析

从题述来看,有如下几个关键点:

1.有这么一个文本文件

2.读入文件中的文本

3.统计文件中字符数

4.判断文件的结尾

下面再给出这4步的每一步的解决思路。

2. 打开文件

这是要解决的第一个技术点。使用文件I/O包中的fopen函数打开文件,最后记得一定要fclose这个文件。

3. 统计文件中字符数

这是要解决的第二个技术点。如果有一种方法,能够逐一地读取每行的每一个字符,并且每读完一个字符,字符计数器就自增1,那么我们的目的就达到了。在文件I/O函数包中,

getc函数就可以达到这个目的。getc函数的功能是逐一读取文件中的每一个字符,当然包含每行的结尾的换行符,它需要一个文件指针作为参数。

4. 判断文件的结尾

这是要解决的第三个技术点,即,如何判断getc函数已经读到了文件末尾。在C中,针对不同的系统,统一以一个“EOF”来表示文件的末尾。这个“EOF”如果你到头文件中查看其

定义,会看到可能是一个整数值,比如“-1”。getc()函数遇到文件末尾后就会返回“EOF”。本程序在getc函数达到文件末尾后,打印出EOF,看看在我的编译环境中EOF的定义值

是什么。

三、代码实现

根据上述分析,主要代码如下:

pFile = fopen("author.txt","r");

while( (ch = getc(pFile)) != EOF)

{

printf("%d ", ch);

count++;

}

putchar('\n');

printf("文件结尾是: %d\n", ch);

代码以文本模式打开文件,getc函数使用pFile这个文件指针作为参数,从pFile指向的文件中逐一读取字符,在每读取一个字符时,计数器count自增。当文件位置指示器达到文件

末尾时,也就是getc函数读到文件末尾时,while循环退出。此时计数器count的值便是文件中字符的个数。由于此时文件位置指示器指向结尾,在退出while循环后,代码会将EOF对应的值打出。

完整的代码下载地址:

四、运行结果

本程序的运行环境如下:

OS:Windows XP sp3

编译器:TDM-GCC 4.9.2 32-bit Release

运行结果如图:

image

从运行结果来看,统计出的字符数是97,并且打印出的EOF的值为-1.在我的编译环境中,EOF的值被定义为-1.也许在你的编译环境中,EOF的定义值和我不一样。

现在我将代码中的文件打开模式修改下,如下:

pFile = fopen("author.txt","rb");

使用二进制模式打开文件,那么再来运行下,看看结果如何:

image

比较两种不同的文件打开模式,一个是文本打开模式,一个是二进制打开模式,发现使用getc函数统计出的字符数不一样!

为了解释这种现象,我就拿本例的文本文件的第一行的内容“weibo: http://weibo.com/520JDH” 画个示意图吧,如下:

image

这个示意图是在Windows上,文件内容的存储方式示意图。可以看到,一行的换行符其实是由两个字符组成的:一个是\r,一个是\n。如果以二进制模式打开这个文件,那么,对于

getc来说,它将看到两个字节,一个是“00001101”(\r的二进制),一个是“00001010”(\n的二进制),因此getc函数在每行末尾会统计到这两个字符。

如果以文本模式打开这个文件,那么C实现会做一个转换,将“\r\n”两个字符转换成一个字符“\n”,我再画个示意图如下:

image

此时getc只能看到一个“00001010”(\n的二进制),因此在每行的末尾,getc函数只会统计到“\n”这一个字符。因此在最终的统计结果中,以文本模式打开统计的字符数比以

二进制模式打开统计的字符数要少两个,少的这两个就是“author.txt”中第一行和第二行末尾的“\r”字符。

由于在linux上,一般而言,一行的结尾只有换行“\n”这一个字符,因此如果运行环境是linux,那么不管是以文本模式打开还是二进制模式打开,统计到的字符数都是99.有条件

的朋友可以自行试下。

五、技术点

本文给出了一种统计文件字符数的方法,关键技术点是getc函数。如果运行环境是Win的话,要注意文本模式和二进制模式的区别。

六、总结

目前为止,为了实现统计一个文件中的字符数的方法,使用了三个不同的技术手段,一个是重定向技术,一个是文件I/O包中的fseek和ftell,最后一个是I/O包中的getc函数。三

种方法各有优缺点。朋友们今后需要在自己的项目中实现这一小功能,可以考虑这三种方法。

以下是对提供的参考资料的总结,按照要求结构化多个要点分条输出: 4G/5G无线网络优化与网规案例分析: NSA站点下终端掉4G问题:部分用户反馈NSA终端频繁掉4G,主要因终端主动发起SCGfail导致。分析显示,在信号较好的环境下,终端可能因节能、过热保护等原因主动释放连接。解决方案建议终端侧进行分析处理,尝试关闭节电开关等。 RSSI算法识别天馈遮挡:通过计算RSSI平均值及差值识别天馈遮挡,差值大于3dB则认定有遮挡。不同设备分组规则不同,如64T和32T。此方法可有效帮助现场人员识别因环境变化引起的网络问题。 5G 160M组网小区CA不生效:某5G站点开启100M+60M CA功能后,测试发现UE无法正常使用CA功能。问题原因在于CA频点集标识配置错误,修正后测试正常。 5G网络优化与策略: CCE映射方式优化:针对诺基亚站点覆盖农村区域,通过优化CCE资源映射方式(交织、非交织),提升RRC连接建立成功率和无线接通率。非交织方式相比交织方式有显著提升。 5G AAU两扇区组网:与三扇区组网相比,AAU两扇区组网在RSRP、SINR、下载速率和上传速率上表现不同,需根据具体场景选择适合的组网方式。 5G语音解决方案:包括沿用4G语音解决方案、EPS Fallback方案和VoNR方案。不同方案适用于不同的5G组网策略,如NSA和SA,并影响语音连续性和网络覆盖。 4G网络优化与资源利用: 4G室分设备利旧:面对4G网络投资压减与资源需求矛盾,提出利旧多维度调优策略,包括资源整合、统筹调配既有资源,以满足新增需求和提质增效。 宏站RRU设备1托N射灯:针对5G深度覆盖需求,研究使用宏站AAU结合1托N射灯方案,快速便捷地开通5G站点,提升深度覆盖能力。 基站与流程管理: 爱立信LTE基站邻区添加流程:未提供具体内容,但通常涉及邻区规划、参数配置、测试验证等步骤,以确保基站间顺畅切换和覆盖连续性。 网络规划与策略: 新高铁跨海大桥覆盖方案试点:虽未提供详细内容,但可推测涉及高铁跨海大桥区域的4G/5G网络覆盖规划,需考虑信号穿透、移动性管理、网络容量等因素。 总结: 提供的参考资料涵盖了4G/5G无线网络优化、网规案例分析、网络优化策略、资源利用、基站管理等多个方面。 通过具体案例分析,展示了无线网络优化中的常见问题及解决方案,如NSA终端掉4G、RSSI识别天馈遮挡、CA不生效等。 强调了5G网络优化与策略的重要性,包括CCE映射方式优化、5G语音解决方案、AAU扇区组网选择等。 提出了4G网络优化与资源利用的策略,如室分设备利旧、宏站RRU设备1托N射灯等。 基站与流程管理方面,提到了爱立信LTE基站邻区添加流程,但未给出具体细节。 新高铁跨海大桥覆盖方案试点展示了特殊场景下的网络规划需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值