C语言:关注EOF


EOF是指文件的结束符,是一个宏定义

    借助于getchar 与putchar 函数,可以在不了解其它输入/输出知识的情况下编写出
数量惊人的有用的代码。最简单的例子就是把输入一次一个字符地复制到输出,其基本思想
如下:
读一个字符
while (该字符不是文件结束指示符)
输出刚读入的字符
读下一个字符
将上述基本思想转换为C语言程序为:

复制代码
#include <stdio.h>
main()
{
int c;
  
c = getchar();
while(c != EOF)
{
putchar(c);
c = getchar();
}
}
复制代码

而且理解这个代码并不是一件困难的事情,相反,太简单了.但是,如果深究,就会发现一个有意思的事情,如果不考虑重定向,也就是说,我们是从stdin 输入的,那么,我们应该输入什么信息,被认为是EOF呢?细心的读者可能注意到了,我们在声明变量c的时候,并没有将其声明为char类型,原因在于我们的c必须可以容纳所谓的EOF,想象一下,我使用的系统是Fedora,glib里头包含的stdio.h文件中将EOF定义为-1,很显然,将c定义为 char类型的话,他怎么可以容纳EOF呢?      

下面我作一下实验,目的就是想找到,到底什么信息可以结束我们的这个程序 , 假设我的得到的可执行文件是test,输入./test,系统等待输入,当我输入“i  am  rockics”并回车时候,系统输出“i am  rockics”,且继续等待输入,显然回车不能让他退出执行 。

于是,我按下组合键“Ctrl+Z”,表面上好像test不执行了,细心点会发现,屏幕的输出信息:

[1]+  Stopped                 ./test

只是stopped了,但是是否exit了呢?

很容易验证,输入命令ps,查看当前用户进程,我发现一下结果:

[rockics@localhost c]$ ps
  PID TTY          TIME CMD
3365 pts/1    00:00:00 bash
4471 pts/1    00:00:00 test
4484 pts/1    00:00:00 ps

test还在后台运行呢,呵呵。你必须显示的kill它才可以。

那么,要不试试看“Ctrl+D”,好试试看,我们首先用“ kill -9 4471”将test杀死,然后重新执行之:

[rockics@localhost c]$ kill -9 4471
[1]+  已杀死               ./test
[rockics@localhost c]$ ./test
i am rockicsi am rockics

嘿,后面那个“i am rockics”是我按下“Ctrl+D”输出的,哈哈,和回车键产生的效果差不多哦,只是没有换行。

这个时候,无论怎么输入回车,都发现test一直在等待用户输入,就是不肯退出来,哎,不乖 。

但是这个时候(按过回车键之后),我再次按下“Ctrl+D”,就发现,test没了,ps,也没发现,也就是说test正常完成任务,退出了 。

[rockics@localhost c]$ ps
  PID TTY          TIME CMD
3365 pts/1    00:00:00 bash
4502 pts/1    00:00:00 ps 

也就是说,输入完成,按下回车,然后“Ctrl+D”,可以结束test。

至于深层次的分析,当然要考虑到系统的实现,首先,输入缓冲是行缓冲。当从键盘上输入一串字符并按回车后,这些字符会首先被送到输入缓冲区中存储。每当按下回车键后,cin.get() 就会检测输入缓冲区中是否有了可读的数据。cin.get() 还会对键盘上是否有作为流结束标志的 “Ctrl+Z”或者 “Ctrl+D”键按下作出检查,其检查的方式有两种:阻塞式以及非阻塞式。

阻塞式检查方式指的是只有在回车键按下之后才对此前是否有“Ctrl+Z” 组合键按下进行检查,非阻塞式样指的是按下“Ctrl+D” 之后立即响应的方式。如果在按 “Ctrl+D”之前已经从键盘输入了字符,则 “Ctrl+D”的作用就相当于回车,即把这些字符送到输入缓冲区供读取使用,此时“Ctrl+D”不再起流结束符的作用。如果按 “Ctrl+D”之前没有任何键盘输入,则 “Ctrl+D”就是流结束的信号

Windows系统中一般采用阻塞式检查 “Ctrl+Z”、Unix/Linux系统下一般采用非阻塞式的检查 “Ctrl+D”。我使用的是Fedora系统,因此使用非阻塞式的 “Ctrl+D”来标识流的结束。

Bye!


// 使用异或操作对字符串s进行逆序
char* Reverse(char* s)
{
    char* r = s ;

    //令p指向字符串最后一个字符
    char* p = s;
    while (*(p + 1) != '\0')
        ++p ;

    // 使用异或操作进行交换
    while (p > s)
    {
        *p = *p ^ *s ;
        *s = *p ^ *s ;
        *p = *p-- ^ *s++ ;
    }

    return r ;
}


CH341A编程器是一款广泛应用的通用编程设备,尤其在电子工程和嵌入式系统开发领域中,它被用来烧录各种类型的微控制器、存储器和其他IC芯片。这款编程器的最新版本为1.3,它的一个显著特点是增加了对25Q256等32M芯片的支持。 25Q256是一种串行EEPROM(电可擦可编程只读存储器)芯片,通常用于存储程序代码、配置数据或其他非易失性信息。32M在这里指的是存储容量,即该芯片可以存储32兆位(Mbit)的数据,换算成字节数就是4MB。这种大容量的存储器在许多嵌入式系统中都有应用,例如汽车电子、工业控制、消费电子设备等。 CH341A编程器的1.3版更新,意味着它可以与更多的芯片型号兼容,特别是针对32M容量的芯片进行了优化,提高了编程效率和稳定性。26系列芯片通常指的是Microchip公司的25系列SPI(串行外围接口)EEPROM产品线,这些芯片广泛应用于各种需要小体积、低功耗和非易失性存储的应用场景。 全功能版的CH341A编程器不仅支持25Q256,还支持其他大容量芯片,这意味着它具有广泛的兼容性,能够满足不同项目的需求。这包括但不限于微控制器、EPROM、EEPROM、闪存、逻辑门电路等多种类型芯片的编程。 使用CH341A编程器进行编程操作时,首先需要将设备通过USB连接到计算机,然后安装相应的驱动程序和编程软件。在本例中,压缩包中的"CH341A_1.30"很可能是编程软件的安装程序。安装后,用户可以通过软件界面选择需要编程的芯片类型,加载待烧录的固件或数据,然后执行编程操作。编程过程中需要注意的是,确保正确设置芯片的电压、时钟频率等参数,以防止损坏芯片。 CH341A编程器1.3版是面向电子爱好者和专业工程师的一款实用工具,其强大的兼容性和易用性使其在众多编程器中脱颖而出。对于需要处理25Q256等32M芯片的项目,或者26系列芯片的编程工作,CH341A编程器是理想的选择。通过持续的软件更新和升级,它保持了与现代电子技术同步,确保用户能方便地对各种芯片进行编程和调试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值