betway必威-betway必威官方网站
做最好的网站

betway必威官方网站:的使用详解,关于文件结束

今天打算从新学习下C 结合这个高级语言学习算法等东西 。。第一天。

基于C语言EOF与getchar()的使用详解,eofgetchar

转自:

 

大师级经典的著作,要字斟句酌的去读,去理解。以前在看K&R的The C Programming Language(SecondEdition)
第1.5节的字符输入/输出,被getchar()和EOF所迷惑了。可能主要还是由于没有搞清楚getchar()的工作原理和EOF的用法。因此,感觉很有必要总结一下,不然,很多琐碎的知识点长时间过后就会淡忘的,只有写下来才是最好的方法。

其实,getchar()最典型的程序也就几行代码而已。本人所用的环境是DebianGNU/Linux,在其他系统下也一样。

一、getchar的两点总结: 1.getchar是以行为单位进行存取的。
当用getchar进行输入时,如果输入的第一个字符为有效字符(即输入是文件结束符EOF,Windows下为组合键Ctrl Z, Unix/Linux下为组合键Ctrl D),那么只有当最后一个输入字符为换行符'n'(也可以是文件结束符EOF,EOF将在后面讨论)时, getchar才会停止执行,整个程序将会往下执行。譬如下面程序段:

while((c = getchar()) != EOF){
    putchar(c);
}

执行程序,输入:abc,然后回车。则程序就会去执行puchar(c),然后输出abc,这个地方不要忘了,系统输出的还有一个回车。然后可以继续输入,再次遇到换行符的时候,程序又会把那一行的输入的字符输出在终端上。

对于getchar,肯定很多初学的朋友会问,getchar不是以字符为单位读取的吗?那么,既然我输入了第一个字符a,肯定满足while循环(c = getchar()) != EOF的条件阿,那么应该执行putchar(c)在终端输出一个字符a。不错,我在用getchar的时候也是一直这么想的,但是程序就偏偏不着样执 行,而是必需读到一个换行符或者文件结束符EOF才进行一次输出。

对这个问题的一个解释是,在大师编写C的时候,当时并没有所谓终端输入的概念,所有的输入实际上都是按照文件进行读取的,文件中一般都是以行为单位的。因 此,只有遇到换行符,那么程序会认为输入结束,然后采取执行程序的其他部分。同时,输入是按照文件的方式存取的,那么要结束一个文件的输入就需用到EOF (Enf Of File). 这也就是为什么getchar结束输入退出时要用EOF的原因。

2.getchar()的返回值一般情况下是字符,但也可能是负值,即返回EOF。

这里要强调的一点就是,getchar函数通常返回终端所输入的字符,这些字符系统中对应的ASCII值都是非负的。因此,很多时候,我们会写这样的两行代码:
char c;
c = getchar();

这样就很有可能出现问题。因为getchar函数除了返回终端输入的字符外,在遇到Ctrl D(Linux下)即文件结束符EOF时,getchar ()的返回EOF,这个EOF在函数库里一般定义为-1。因此,在这种情况下,getchar函数返回一个负值,把一个负值赋给一个char型的变量是不 正确的。为了能够让所定义的变量能够包含getchar函数返回的所有可能的值,正确的定义方法如下(K&R C中特别提到了这个问题):
int c;
c = getchar();

二、EOF的两点总结(主要指普通终端中的EOF) 1.EOF作为文件结束符时的情况:

EOF虽然是文件结束符,但并不是在任何情况下输入Ctrl D(Windows下Ctrl Z)都能够实现文件结束的功能,只有在下列的条件下,才作为文件结束符。
(1)遇到getcahr函数执行时,要输入第一个字符时就直接输入Ctrl D,就可以跳出getchar(),去执行程序的其他部分;
(2)在前面输入的字符为换行符时,接着输入Ctrl D;
(3)在前面有字符输入且不为换行符时,要连着输入两次Ctrl D,这时第二次输入的Ctrl D起到文件结束符的功能,至于第一次的Ctrl D的作用将在下面介绍。
其实,这三种情况都可以总结为只有在getchar()提示新的一次输入时,直接输入Ctrl D才相当于文件结束符。

2.EOF作为行结束符时的情况,这时候输入Ctrl D并不能结束getchar(),而只能引发getchar()提示下一轮的输入。

这种情况主要是在进行getchar()新的一行输入时,当输入了若干字符(不能包含换行符)之后,直接输入Ctrl D,此时的Ctrl D并不是文件 结束符,而只是相当于换行符的功能,即结束当前的输入。以上面的代码段为例,如果执行时输入abc,然后Ctrl D,程序输出结果为:
abcabc

注意:第一组abc为从终端输入的,然后输入Ctrl D,就输出第二组abc,同时光标停在第二组字符的c后面,然后可以进行新一次的输入。这时如果再次输入Ctrl D,则起到了文件结束符的作用,结束getchar()。
如果输入abc之后,然后回车,输入换行符的话,则终端显示为:
abc //第一行,带回车
abc //第二行
//第三行

其中第一行为终端输入,第二行为终端输出,光标停在了第三行处,等待新一次的终端输入。
从这里也可以看出Ctrl D和换行符分别作为行结束符时,输出的不同结果。
EOF的作用也可以总结为:当终端有字符输入时,Ctrl D产生的EOF相当于结束本行的输入,将引起getchar()新一轮的输入;当终端没有字符 输入或者可以说当getchar()读取新的一次输入时,输入Ctrl D,此时产生的EOF相当于文件结束符,程序将结束getchar()的执行。
【补充】本文第二部分中关于EOF的总结部分,适用于终端驱动处于一次一行的模式下。也就是虽然getchar()和putchar()确实是按照每次一个字符 进行的。但是终端驱动处于一次一行的模式,它的输入只有到“n”或者EOF时才结束,因此,终端上得到的输出也都是按行的。
如果要实现终端在读一个字符就结束输入的话,下面的程序是一种实现的方法(参考《C专家编程》,略有改动)

代码如下:

/*Edit by Godbach
    CU Blog:
*/
#include <stdio.h>
#include <stdlib.h>

int
main(void)
{
    int c;
    /* 终端驱动处于普通的一次一行模式 */
    system("stty raw");

    /* 现在的终端驱动处于一次一个字符模式 */
    c = getchar();
    putchar();

    /* 终端驱动处又回到一次一行模式 */
    system("stty cooked");

    return 0;
}

编译运行该程序,则当如入一个字符时,直接出处一个字符,然后程序结束。
由此可见,由于终端驱动的模式不同,造成了getchar()输入结束的条件不一样。普通模式下需要回车或者EOF,而在一次一个字符的模式下,则输入一个字符之后就结束了。

转自: 大师级经典的著作,要字斟句酌的去读,去理解。以前在看...

 

发现个小问题如标题。是《c语言程序设计(C语言之父)》---网友推荐的书。我看到前面的时候看到这个标题的问题。

地址:

测试代码:

我看这两个的区别都不知为这有多愁, 就是看不懂, 想不通, 时间放长了, 真还是不懂, 学了这么时间都不懂两个区别, 也不知什么时候用哪个EOF  feof , 一直为这困惑....不清,

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

这两个区别为什么搞不懂呢, 网上资讲得真是迷惑不解,  我就一心找找找.....找找找....再找....

发现输出的结果很奇特。

找找找.....找找找....再找....找找找.....找找找....再找....
找找找.....找找找....再找....没有人来给你讲区别, 有只自己给自己当老师, 自己就是世界上最好的老师.
重点开始:

有DEV-C/C 的朋友可以看看。

QUOTE:

一开始我真的以为出问题了。

原帖由 思一克 于 2007-8-24 16:32 发表 betway必威官方网站 1
getchar()的返回应定义为INT. 而不是char

后来我想这应该是个什么东西 ?

看高手过招,学习了。

EOF到底是什么?

版主说得对,getchar的定义是:int getchar(void), 应该返回int.betway必威官方网站 2

测试发现。EOF什么都不是只是end-of-file(文本结束)如意义一样。只是个结束。我这样理解是个 "";

betway必威官方网站 3 原帖由 whyglinux 于  2008 - 6 - 6   22 : 46  发表 
betway必威官方网站 4 >>  关于文件结束符EOF
betway必威官方网站 5
betway必威官方网站 6EOF 是 End Of File 的缩写。
betway必威官方网站 7
betway必威官方网站 8在 C 语言中,它是在标准库中定义的一个宏。
betway必威官方网站 9
betway必威官方网站 10人们经常误认为 EOF 是从文件中读取的一个字符。其实,EOF 不是一个字符,它被定义为是  int  类型的一个 betway必威官方网站 11 
betway必威官方网站 12说的标准. 正解.

JS中不是经常这样 var a = "abcdefg".split("") ;console.log(a)--->[a,b,c,d,e,f,g];

>> 关于文件结束符EOF

那么这个结束不是"" 是什么。是1.因为进入程序默认有了一个结束。这样就能得到结束。所以我认为,getchar()!=EOF 是肯定会执行至少一次。

EOF 是 End Of File 的缩写。

所以:我们千万不要用这方法进行检索(除非实际应用必须用到)不然死锁不能跳出就真的悲剧了。程序就一直执行下去。直到强制关闭。

在 C 语言中,它是在标准库中定义的一个宏。


人们经常误认为 EOF 是从文件中读取的一个字符(牢记)。其实,EOF 不是一个字符,它被定义为是 int 类型的一个负数(比如 -1)。EOF 也不是文件中实际存在的内容。EOF 也不是只表示读文件到了结尾这一状态(这种状态可以用 feof() 来检测),它还能表示 I/O 操作中的读、写错误(通常可以用 ferror() 来检测)以及其它一些关联操作的错误状态。

getchar 返回EOF如果读到文件末

大师级经典的著作,要字斟句酌的去读,去理解。以前在看K&R的The C Programming Language(SecondEdition)
第1.5节的字符输入/输出,被getchar()和EOF所迷惑了。可能主要还是由于没有搞清楚getchar()的工作原理和EOF的用法。因此,感觉很有必要总结一下,不然,很多琐碎的知识点长时间过后就会淡忘的,只有写下来才是最好的方法。

其实,getchar()最典型的程序也就几行代码而已。本人所用的环境是DebianGNU/Linux,在其他系统下也一样。
一、getchar的两点总结:
1.getchar是以行为单位进行存取的。
当用getchar进行输入时,如果输入的第一个字符为有效字符(即输入是文件结束符EOF,Windows下为组合键Ctrl Z,Unix/Linux下为组合键Ctrl D),那么只有当最后一个输入字符为换行符'n'(也可以是文件结束符EOF,EOF将在后面讨论)时,getchar才会停止执行,整个程序将会往下执行。譬如下面程序段:

while((c =getchar())!=EOF){
    putchar(c);
}

执行程序,输入:abc,然后回车。则程序就会去执行puchar(c),然后输出abc,这个地方不要忘了,系统输出的还有一个回车。然后可以继续输入,再次遇到换行符的时候,程序又会把那一行的输入的字符输出在终端上。

对于getchar,肯定很多初学的朋友会问,getchar不是以字符为单位读取的吗?那么,既然我输入了第一个字符a,肯定满足while循环(c = getchar()) != EOF的条件阿,那么应该执行putchar(c)在终端输出一个字符a。不错,我在用getchar的时候也是一直这么想的,但是程序就偏偏不着样执行,而是必需读到一个换行符或者文件结束符EOF才进行一次输出。

对这个问题的一个解释是,在大师编写C的时候,当时并没有所谓终端输入的概念,所有的输入实际上都是按照文件进行读取的,文件中一般都是以行为单位的。因此,只有遇到换行符,那么程序会认为输入结束,然后采取执行程序的其他部分。同时,输入是按照文件的方式存取的,那么要结束一个文件的输入就需用到EOF(Enf Of File). 这也就是为什么getchar结束输入退出时要用EOF的原因。

本文由betway必威发布于编程开发,转载请注明出处:betway必威官方网站:的使用详解,关于文件结束

TAG标签: betway必威
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。