C Primer Plus 第8章 字符輸入/輸出和輸入確認 8.3 重定向和文件

輸入和輸出涉及到函數、數據和設備。例如,考慮echo_eof.c程序。該程序使用了輸入函數getchar()、輸入設備(咱們已經假設)是鍵盤,輸入數據流由單獨的字符組成。假設您但願保持相同的輸入函數和相同的類型的數據,但但願改變程序尋找數據的位置。「程序如何瞭解在哪裏尋找其輸入?」linux

默認狀況下,使用標準I/O包的C程序將標準輸入做爲其輸入源。這就是前面標識爲stdin的流。該流是做爲向計算機中讀取數據的常規方式而創建的。一臺現代的計算機是一個靈活的工具,您可能指示它到其餘地方尋求輸入。特別地,您能夠告訴一個程序從文件而不是鍵盤尋求其輸入。shell

令程序與文件一同工做有兩種方式。一種方式是明確的使用打開文件、關閉文件、讀文件、寫文件等專門的函數。這種方法咱們在第13章中討論。第二種方式是使用一個設計用於與鍵盤和屏幕共同工做的程序,可是使用不一樣通道重定向(redirect)輸入和輸出,例如輸入到文件和從文件中輸出。換句話說,就是您將stdin流從新分配至文件。getchar()程序繼續從該流中取數據,而不真正關心流是從何處獲取其數據。這種方法比第一種方法在一此方面功能更有限,但它更容易使用,並且使您可以更加熟悉經常使用的文件處理技術。函數

重定向的一個主要問題是其與操做系統而不是C相關聯。工具

Unix、Linux和Dos重定向學習

1、輸入重定向spa

假設您已經編譯了echo_eof.c程序,並將它的可執行版本放在一個名爲echo_eof的文件中(或在Dos系統上爲echo_eof.exe)。要運行該程序,請鍵入該 可執行文件的名字:操作系統

echo_eof命令行

如今假設您但願對一個名爲words的文本文件使用該程序。文本文件是包含文本的文件,即在該 文件中的數據是以人類可讀的字符形式存儲。由於該程序處理的是字符,因此它應該與文本文件一同使用。全部您須要作的就是輸入命令時使用下列命令代替前面的命令:設計

echo_eof < wordsunix

<符號是Unix、Linux和Dos的重定向運算符。該運算符把words和stdin流關聯起來,將該文件的內容引導至echo_eof程序。echo_eof程序自己並不知道(或關心)輸入是來自文件而不是來自鍵盤 。該程序所知道的一切就是向它傳遞了一個字符流。因爲C將文件和I/O設備置於相同的地位,因此如今這個文件就是I/O設備。

2、輸出重定向

如今假設您但願echo_eof將您的鍵盤輸入發送給一個名爲mywords的文件。那麼您能夠輸入下列的命令並開始鍵入 :

echo_eof > mywords

>是另外一個重定向運算符。該 運算符會致使創建一個名爲mywords的新文件供您使用,而後將echo_eof的輸出(也就是說,您鍵入的字符的副本)重定向到該文件。該重定向將stdout從顯示設備(您的屏幕)重定向到mywords文件。您鍵入字母時在你的屏幕上出現的就是這些字母,而且它們的副本將保存到文件中。要結束程序,請在一行的開始鍵入ctrl+D(Unix中)或ctrl+Z(Dos中)。

3、組合重定向

如今假設您但願製做文件mywords的一個副本,並將其命名爲savewords。只需發出下列命令:

echo_eof < mywords >savewords

下面這個命令一樣能夠實現這一功能,由於重定向運算符的順序可有可無:

echo_eof >savewords<mywords

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

echo < mywords > mywords  --WRONG

緣由是>mywords使原始的mywords文件在用於輸入以前升序被截短爲零。

簡單的說,下面是在unix linux dos 下使用兩個重定向運算符< 和 >所遵循的規則:

一、重定向運算符將一個可執行的程序與個數據文件鏈接起來。該運算符不能用於一個數據文件與另外一個數據文件的鏈接,也不能用於一個程序與另外一個程序的鏈接。

二、使用這些運算符時,輸入不能來自一個以上的文件,輸出也不能定向至一個以上的文件

三、除了偶爾在使用到一些對unix shell \ lunux shell 或dos具備特殊 意義的字符 時,名字和操做符之間的空格並非必需的

4、註釋

重定向使您可以把鍵盤輸入程序用於文件。

第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;
}
相關文章
相關標籤/搜索