• chapter 8 in C primer plus


    1、 getchar() 和putchar()

                    一个一个字符的读取和输出

    2、以上宏使用缓存区进行输出刷新

            两种缓冲区:

                    1、完全缓冲区 fully buffered

                                    当缓冲区满的时候被清空,即缓冲区满的时候将内容刷新到目的地。一般出现在文件输入中。 缓冲区大小一般为512或者4096字节

                    2、行缓冲区: line buffered

                              当遇到换行符的时候,就将缓冲区的内容进行清空,刷新。例如:键盘输入是标准的行缓冲。

    3、c中getchar() 在到达文件结尾时返回一个特殊值,而不去管操作系统是如何检测文件结尾的。赋予该值的名称是EOF(end of file),所以监测到文件结尾的返回值是EOF。同样scanf()也是通过检测EOF来判断是否已经到文件尾部。

            EOF 在stdio.h中进行定义: #defien EOF (-1)

            -1 值不出现在ASCII 码表中,而且是负值。

            注释: c语言实际判断文件是否到达尾部的方法是: 判断当前读取的位置与文件的大小进行比较,如果两个值相同那么说明已经到了文件的尾部,这时候读取文件的函数返回EOF。

            一般情况下,现代操作系统都是如此处理是否到达文件尾部的。

            注释2: 早期MS_DOS系统通过在文件的尾部添加^z 来表示文件尾部,也就是说,只要读取到^z 该字符就表示已经读取到了文件尾部。

            注释3:

                    window系统文件:

                            行尾是使用的\r\n

                    linux 系统文件:

                            行尾是使用的\n

                    因此window文件拷贝到linux下格式是不正确的,尤其是可执行的脚本文件将会发生错误。

            注释4: 如果要是通用getchar()中输入结束符号EOF,则必须知道该操作系统结束标记是什么,不可简单的输入EOF、-1 来结束输入。有些系统是痛ctrl+D, 有些系统是痛ctrl+z等

    4、重定向

            <  重定向输入

            >  重定向输出

            

    1. /* echo.c -- */
    2. #include <stdio.h>
    3. int main(void)
    4. {
    5. char ch;
    6. while((ch=getchar()) != EOF)
    7. {
    8. putchar(ch);
    9. }
    10. return 0;
    11. }

    编译对象为a.out

       执行: a.out < filename  将文件filename中的内容输入到a.out程序中

       执行: a.out > filename  将输入流中的内容,重定向输出到filename文件中。

        文件拷贝:        多个重定向

            a.out < sourcefile > distiname  将sourcefile文件拷贝到distiname文件中

    5、实例代码:打印文件内容

    1. /* file_eof.c -- */
    2. #include <stdio.h>
    3. #include <stdlib.h>
    4. int main(void)
    5. {
    6. char ch;
    7. FILE * fp;
    8. char fname[50];
    9. printf("Please enter the name of the file:");
    10. scan("%s",fname);
    11. fp = fopen(fname,"r");
    12. if(fp == NULL)
    13. {
    14. printf("Failed to open file ");
    15. exit(1);
    16. }
    17. while((ch=getc(fp)) != EOF)
    18. {
    19. putchar(ch);
    20. }
    21. fclose(fp);
    22. return 0;
    23. }

    6 、

            getchar 会获取每一个字符,不会遗漏任何字符

            scanf 读取输入的时候会跳过空白字符,包括制表符、空白符、换行符。即scanf以遇到的第一个空白符为一个整体进行输入读取。返回值成功读取到的数据个数。

    7、在c语言的输入输出函数中尤其要注意:空白字符和换行符号等不可见字符对程序的影响。

       

  • 相关阅读:
    老生常谈:面试必问“三次握手,四次挥手”这么讲,保证你忘不了
    MySQL | 行锁——记录锁、间隙锁 、临键锁、插入意向锁
    uniapp-提现功能(demo)
    如此狂妄,自称高性能队列的Disruptor有啥来头?
    Flutter 的状态管理
    【MindSpore】【TFRecordDataset】无法正确处理tfrecord文件
    【收藏系列】多线程的代码案例(单例模式 + 阻塞队列 + 定时器 + 线程池)
    【Azure 环境】【Azure Developer】使用Python代码获取Azure 中的资源的Metrics定义及数据
    1312. 序列统计
    C++ Reference: Standard C++ Library reference: C Library: cwchar: vwprintf
  • 原文地址:https://blog.csdn.net/qq_31319235/article/details/126511145