文档章节

C Primer Plus 第8章 字符输入/输出和输入确认 8.3 重定向和文件

idreamo
 idreamo
发布于 2016/06/28 06:29
字数 1773
阅读 176
收藏 0

输入和输出涉及到函数、数据和设备。例如,考虑echo_eof.c程序。该程序使用了输入函数getchar()、输入设备(我们已经假设)是键盘,输入数据流由单独的字符组成。假设您希望保持相同的输入函数和相同的类型的数据,但希望改变程序寻找数据的位置。“程序如何了解在哪里寻找其输入?”

默认情况下,使用标准I/O包的C程序将标准输入作为其输入源。这就是前面标识为stdin的流。该流是作为向计算机中读取数据的常规方式而建立的。一台现代的计算机是一个灵活的工具,您可能指示它到其他地方寻求输入。特别地,您可以告诉一个程序从文件而不是键盘寻求其输入。

令程序与文件一同工作有两种方式。一种方式是明确的使用打开文件、关闭文件、读文件、写文件等专门的函数。这种方法我们在第13章中讨论。第二种方式是使用一个设计用于与键盘和屏幕共同工作的程序,但是使用不同通道重定向(redirect)输入和输出,例如输入到文件和从文件中输出。换句话说,就是您将stdin流重新分配至文件。getchar()程序继续从该流中取数据,而不真正关心流是从何处获取其数据。这种方法比第一种方法在一此方面功能更有限,但它更容易使用,而且使您能够更加熟悉常用的文件处理技术。

重定向的一个主要问题是其与操作系统而不是C相关联。

Unix、Linux和Dos重定向

一、输入重定向

假设您已经编译了echo_eof.c程序,并将它的可执行版本放在一个名为echo_eof的文件中(或在Dos系统上为echo_eof.exe)。要运行该程序,请键入该 可执行文件的名字:

echo_eof

现在假设您希望对一个名为words的文本文件使用该程序。文本文件是包含文本的文件,即在该 文件中的数据是以人类可读的字符形式存储。因为该程序处理的是字符,所以它应该与文本文件一同使用。所有您需要做的就是输入命令时使用下列命令代替前面的命令:

echo_eof < words

<符号是Unix、Linux和Dos的重定向运算符。该运算符把words和stdin流关联起来,将该文件的内容引导至echo_eof程序。echo_eof程序本身并不知道(或关心)输入是来自文件而不是来自键盘 。该程序所知道的一切就是向它传递了一个字符流。由于C将文件和I/O设备置于相同的地位,所以现在这个文件就是I/O设备。

二、输出重定向

现在假设您希望echo_eof将您的键盘输入发送给一个名为mywords的文件。那么您可以输入下列的命令并开始键入 :

echo_eof > mywords

>是另一个重定向运算符。该 运算符会导致建立一个名为mywords的新文件供您使用,然后将echo_eof的输出(也就是说,您键入的字符的副本)重定向到该文件。该重定向将stdout从显示设备(您的屏幕)重定向到mywords文件。您键入字母时在你的屏幕上出现的就是这些字母,并且它们的副本将保存到文件中。要结束程序,请在一行的开始键入ctrl+D(Unix中)或ctrl+Z(Dos中)。

三、组合重定向

现在假设您希望制作文件mywords的一个副本,并将其命名为savewords。只需发出下列命令:

echo_eof < mywords >savewords

下面这个命令同样可以实现这一功能,因为重定向运算符的顺序无关紧要:

echo_eof >savewords<mywords

注意不要对同一命令的输入和输出使用相同的文件名。

echo < mywords > mywords  --WRONG

原因是>mywords使原始的mywords文件在用于输入之前升序被截短为零。

简单的说,下面是在unix linux dos 下使用两个重定向运算符< 和 >所遵循的规则:

1、重定向运算符将一个可执行的程序与个数据文件连接起来。该运算符不能用于一个数据文件与另一个数据文件的连接,也不能用于一个程序与另一个程序的连接。

2、使用这些运算符时,输入不能来自一个以上的文件,输出也不能定向至一个以上的文件

3、除了偶尔在使用到一些对unix shell \ lunux shell 或dos具有特殊 意义的字符 时,名字和操作符之间的空格并不是必需的

四、注释

重定向使您能够把键盘输入程序用于文件。

第7章中介绍了一个统计字数的程序,该程序统计到第一个'|'字符 为止的单词数。将ch从char类型变为int类型,并在循环判断中使用EOF替代'|',这样您就可以使用该 程序统计文本文件中的单词数了。

//word.c --统计字符、单词和行
#include <stdio.h>
#include <ctype.h>
#include <stdbool.h>
int main(void)
{
    int c ;    //读入字符  c由char改变成int类型
    char prev;  //前一个字符
    long n_chars=0L;  //字符数
    int n_lines=0;    //行数
    int n_words=0;    //单词数
    int p_lines=0;    //不完整的行数
    bool inword=false;  //如果c在一个单词中,则inword等于true

    printf("Enter text to be analyzed(| to terminate): \n");
    prev='\n';    //用于识别完整的行
    while((c=getchar())!=EOF)
    {
        n_chars++;        //统计字符
        if(c=='\n')
            n_lines++;    //统计行数
        if(!isspace(c)&&!inword)
        {
            inword=true;  //开始一个新单词
            n_words++;    //统计单词
        }
        if(isspace(c)&&inword)
            inword=false;  //到达单词尾部
        prev=c;    //保存字字符值
    }
    if(prev!='\n')
        p_lines=1;
    printf("characters=%ld,words=%d,lines=%d,",n_chars,n_words,n_lines);
    printf("partial lines = %d\n",p_lines);
    return 0;
}

重定向是一个命令行概念,因为您要通过在命令行键入特殊符号来指示它。

如果重定向不能正常工作,您可以尝试让程序直接打开文件。程序清单8.3显示了一个带有简单注释的一个例子。详细内容您将在第13章中学习到。

程序清单8.3  file_eof.c程序

//file_eof.c --打开 一个文件并显示其内容
#include <stdio.h>
#include <stdlib.h>  //为了使用exit()
int main (void)
{
    int ch ;
    FILE * fp;
    char fname[50]; //用于存储文件名

    printf("Enter the name of the file :");
    scanf("%s",fname);
    fp=fopen (fname,"r");  //打开文件以供读取 
    if (fp==Null)    //尝试打开文件失败
    {
        printf("Failed to open file.Bye \n");
        exit(1);    //终止程序
    }
    //getc (fp)从打开的文件中获取一个字符
    while ((ch=getc(fp)!=EOF))
        putchar(ch);
    fclose(fp)    //关闭文件
    return 0;
}

 

© 著作权归作者所有

idreamo
粉丝 18
博文 139
码字总数 224743
作品 0
青岛
产品经理
私信 提问
C Primer Plus(5版)第8章编程题1_重定向实现

小伙伴们,对C语言编程有疑问的,可以加微信交流:poo_poo或者扫描我的头像,验证时请注明是“知友” 一、题目描述 本题是第8章编程题的第一道题,题目如下: 二、题目及思路分析 从题述来看...

石家的鱼
2017/07/11
0
0
C Primer Plus(5版)第8章习题讲解(一)

小伙伴们,对C语言编程有疑问的,可以加微信交流:poo_poo或者扫描我的头像,验证时请注明是“知友” C Primer Plus 第五版的第8章的习题3是我觉得是一个很不错的练手习题,考察输入函数、重...

石家的鱼
2017/07/04
0
0
C Primer Plus (第六版) 中文版 随手笔记(七)

版权声明: https://blog.csdn.net/qq_38351824/article/details/80073244 声明:本篇文章只是个人知识盲区、知识弱点、重点部分的归纳总结,望各位大佬不喜勿喷。梳理顺序是按照书籍的实际顺...

sumjess
2018/04/25
0
0
C Primer Plus(5版)第8章习题讲解(二)

小伙伴们,对C语言编程有疑问的,可以加微信交流:poo_poo或者扫描我的头像,验证时请注明是“知友” 8.10 节复习题如下: putchar(getchar())实现的功能较为简单。getchar从标准输入中读取一...

石家的鱼
2017/07/08
0
0
C Primer Plus 第8章 字符输入/输出和输入确认 8.3 终止键盘输入

8.3.1 文件、流和键盘输入 文件是一块存储信息的存储器区域。通常,文件被保存在某种类别的永久存储器上,例如软盘、硬盘或磁盘。 具有强大、灵活等特点的C语言具有许多打开、读取、写入和关...

idreamo
2016/06/27
57
0

没有更多内容

加载失败,请刷新页面

加载更多

浅谈Command命令模式

一、前言 命令也是类,将命令作为一个类来保存,当要使用的时候可以直接拿来使用,比如脚本语言写出的脚本,只需要一个命令就能执行得到我们想要的需要操作很长时间才能得到的结果。这是一个...

青衣霓裳
6分钟前
1
0
Less导入指令

在标准CSS中,@import 规则必须位于所有其他类型的规则之前。但是Less.js不在乎我们将 @import 语句放在什么位置。 @import 伪指令常用于在代码中导入文件,它将Less 代码分布在不同的文件上...

凌兮洛
7分钟前
1
0
【apk】空包签名

命令语法 jarsigner -verbose -keystore [keystorePath] -signedjar [apkOut] [apkIn] [alias] 例 子: jarsigner -verbose -keystore F:\签名\laidianyi_customer.keystore -signedjar F:\......

Agnes2017
11分钟前
2
0
虚拟化的操作技巧!

从物理基础设施迁移到虚拟基础设施时,虚拟环境的设计和布局应模仿物理做法,企业级虚拟化软件允许创建虚拟交换机,虚拟局域网(VLANS)和私有网络可以协助迁移,分析物理和逻辑网络图,复制...

青果云小潘
14分钟前
2
0
SEO网站运营助手

SEO网站运营助手有哪些功能? 提交: 百度链接主动提交 + 熊掌号周推(支持500万条提交额,所以合并在一起提交) 更新: 网站内容改动后,对于已收录的链接,可以选择更新 查询: 对百度收录判断...

NoCome
17分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部