The C Programming Language (2nd)--读书笔记--1.5.1

1.5.1 文件复制

        getchar与putchar函数可在不了解其它输入/输出知识的情况下编写出数量惊人的有用的代码。最简单的例子是把输入一次一个字符地复制到输出,其基本思想是:

        读一个字符

        while(该字符不是文件结束提示符) 

                输出刚读入的字符

                读下一个字符

        上述思想转为C程序为:

#include <stdio .h>

/*copy input to output; 1st version*/
main()
{
    int c;
    c = getchar();
    while (c!=EOF){
        putchar(c);
        c = getchar();
    }
}

关系运算符!=表示“不等于”。

        字符在键盘、屏幕或其他任何地方无论以什么形式表现,它在机器内部都是以位模式存储的。char类型专用于存储这种字符型数据,当然任何整型(int)也可用于存储字符型数据。因为某些潜在的重要原因,在此使用int类型。

        如何区分文件中有效数据与输入结束符? C语言的解决方法是:在没有输入时,函数将返回一个特殊值。这个特殊值与任何实际字符都不同。这个值称为EOF, Enf Of File (文件结束)。在声明变量时,必须让它大到足以存放getchar函数返回的任何值。不把c声明为char类型是因为它必须足够大,除能存储任何可能的字符外,还要能存储文件结束符。因此将c声明为int类型。

         EOF定义在<stdio.h>中,是个整型数。其具体数值是什么并不重要,只要它与任何char类型的值都不相同即可。这里使用符号常量,可确保程序不需要依赖与其对应的任何特定的数值。

        经验较丰富的C语言程序员可把这个字符复制程序编写的更精炼。在C语言中,类似于

c = getchar()

之类的赋值操作是一个表达式,并且具有一个值,即赋值后左边变量表存的值。即,赋值可以作为更大的表达式的一部分出现。将为c赋值的操作放在while循环语句的测试部分中,上述程序可改成:

#include <stdio.h>

/* Copy input to output second version*/
main()
{
    int c;

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

程序中while循环先读一个字符并将其赋值给c,后测试该字符是否为文件结束标志。若否,执行while语句体,并打印该字符。随后重复执行while语句。当到达输入的结尾位置时, while循环语句终止执行,main函数执行结束。

        以上程序将输入集中化, getchar函数在程序中只出现一次,缩短了程序,更紧凑。习惯这种风格后读者就会发现按照这种方式编写的程序更易阅读。经常会看到这种风格。(不过,过多的复杂语句,程序可能难理解,应尽量避免。)

        while语句的条件部分,赋值表达式两边的圆括号不能省略。不等于运算符的优先级比负值运算符等于的优先级高,在不使用圆括号情况下关系测试将在赋值操作之前执行。因此,

c = getchar() != EOF

等价于

c = (getchar() != EOF)

该语句执行后,c将被置0或1(取决于调用getchar函数是否碰到EOF),这并不是希望的结果(更详细的内容请参见第2章相关部分)。

练习 1-6 验证getchar() != EOF的值0还是1。

练习 1-7 编写一个打印EOF的程序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值