C++字符输入方式初探——为什么不能eof

本文探讨了C++中各种字符输入方式,包括C风格的getchar、gets、fgets、scanf和fscanf,以及C++特有的重载运算符、get、getline和read。详细解析了它们的使用场景和区别。
摘要由CSDN通过智能技术生成

前言

众所周知,C++的字符处理,尤其是输入输出,各种“读到文件结束”十分复杂。本文简单研究一下C++的各种字符输入方式。

由于C++提供了各种eof方法以供判断文件结尾,这就让人产生一种写类似这样代码的冲动:

while(eof){
    读入什么东西;
}
而它在绝大多数情况下都是不能正常工作的。如果你改成这样:

while(true){
    读入什么东西;
    if(eof) break;
}

就能正常运行了,但是看上去一点也不不优美酷炫装逼吊炸天。

本文的目的就是对C++中各种主流读入方式,研究第一种方法为什么不行。

注意:本文所有测试都是在Windows环境下进行的。

C风格

C++中,字符输入输出有两种风格:一种是继承于C的,cstdio库中包含的各函数,另一种是C++风格的,iostream/fstream。

在cplusplus.com中,可以查到cstdio的如下成员函数:

getchar();fgetc();getc();
gets();fgets();
scanf();fscanf();
fread();

各种getchar

这里有三个函数:getchar,fgetc和getc。其中,fgetc和getc等价,它们都相当于给定了输入文件指针的getchar。

getchar函数的返回值是一个int:如果它成功读取字符,这个int就等于读取字符的ASCII码,否则就是EOF。这个EOF是编译器用宏定义的一个常数,也就是-1.  “读取不成功”包含你能想到的各种情况:比如读完了文件的最后一个字符,或文件不存在,或文件为空。

如果用getchar读取文件,能否用eof(注意这是小eof,那个大EOF是一个宏定义的常量)判断文件是否结束呢?答案是不行。不妨做个实验:

    freopen("input.in","r",stdin);
    while(!feof(stdin)){
        cout<<(int)getchar()<<endl;
    }

这个feof是cstdio中的eof函数(判断文件是否结束),在这里一定不能用cin.eof(),它俩根本不是一个系统的。

这个原因是为什么呢?在cstdio中,判断eof的方式是设一个标志(end of file indicator),这个标志平时是0,而当你用任何方式试图去读“文件结尾再下一位”的时候,它就会变成一个正值,表明文件结束。但是,如果一直用getchar,那么它站在文件末尾的时候并不知道下一位还有没有东西,那就
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值