重定向和文件:
令程序與文件一同工作有兩種方式:一種是明確地使用打開文件,關閉文件,讀文件,寫文件等等專門的函數。第二種是使用一個設計用於與鍵盤和屏幕共同工作的程序,但是使用不同通道重定向輸入和輸出(何謂輸入輸出重定向?默認情況下輸入是由鍵盤輸入的。輸出是默認的輸出到屏幕上。而輸入輸出重定向就是改變默認的輸入輸出方向)重定向是與其系統相關聯而不是與C相關聯。
輸入重定向:如前面的程序是標準輸入(鍵盤輸入)現在要從一個word或txt文件中讀取輸就會用到<符號來重定向如:程序名 < 文件名(txt,word這個文件一定要在同一目錄下)。<這個符號是系統重定向運算符。該運算符把word或txt文件與stdin流關聯起來,將該文件的內容引導至程序。而程序本身並不知道輸入來自文件還是來自鍵盤,該文件所知道的一切就是向它傳送了一字符流。由於C將文件和I/O設備置於相同的地位,所以現在這個文件就是I/O設置。
輸出重定向:
輸出重定向與輸入重定向相反的作用:就是把程序的標準輸入輸出到一個指定的文件輸出 可以用>輸出重定向運算符方法:程序名 > 文件名(要加後輟)。該重定向將stdout流從顯示設備重定向到文件
組合重定向:
使用重定向運算符( < 和 > )所遵循的規則:
1重定向運算符將一個可執行程序與一個數據文件連接起來。該運算符不能用於一個數
據文件與另數據文件的連接,也不能用於一個程序與另一個程序的連接。
2使用這些運算行時輸入不能來自一個以上的文件,輸出也不能定向一個以上的文件。
3除了偶爾在使用到系統具有特殊意義的字符時,名字和操作符之間空格並不是必需的。
系統還可能具有(>>)運算符:該運算符可使你向一個現有文件的末尾追加數據。還有管道運算符(|)它可以將一個程序的輸出與第二個程序的輸入連接起來
註釋:
重定向使你能夠把鍵盤輸入程序用於文件。要使其工作,該程序必須能夠檢測文件尾。重定向是一個命令行概念,因爲你要通過在命令行鍵入特殊符號來指示它。
創建一個更友好的用戶界面:
緩衝輸入通常會給用戶帶來方便,它提供了在將輸入發送至程序前對其進行編輯的機會,但在使用字輸入時會給編程人員畫帶來麻煩,因爲getchar()不會跳過回車把所有的字符都讀取這就給程序帶來了一些副作用。如下面的程序:
//8-4.c
#include <stdio.h>
int main (void)
{
int guess = 1;
printf ("Pick an intger from 1 to 100.I will try to guess");
printf ("it .\nRespond with a y if my guess is right and with");
printf ("\nan nif it is wrong .\n");
printf ("Uh... is you mumber %d?\n",guess);
while (getchar () != 'y')
printf ("Well ,then is it %d?\n",++guess);
printf ("I knew I could do it !");
return 0 ;
}
此程序在每次輸入n時都會進行兩次猜測,在這中間所發生的事情是程序讀取n響應並把它看作是你對1的否定,然後讀取換行字符並把它看作是你對2的否定。一種解決方案是使用一個while 循環來丟棄輸入行的其它部分。包括換行符。如:
while (getchar () != ‘y’)
{
printf ("Well ,then is it %d?\n",++guess);
while (getchar () != ‘n’)
continue;
}
混合輸入數字與字符:
在分開時它們可以很好的完成其工作,但是它們不能很好的混合在一起,這是因爲getchar ()讀取每一個字符,而scanf()它會跳過空格,製表符,和換行符。
//8-5.c
#include <stdio.h>
void display (char cr,int lines,int width);
int main (void)
{
int ch;
int rows,cols;
printf ("Enter a character and two integers :\n");
while ((ch = getchar()) != '\n')
{
scanf ("%d %d",&rows,&cols);
display (ch,rows,cols);
printf ("Enter anoter charcter and two integers:\n");
printf ("Enter a newline to quit. \n");
}
printf ("Bye. \n");
return 0;
}
void display (char cr,int lines,int width)
{
int row ,col;
for (row = 1;row <= lines ;row++)
{
for (col = 1;col <= width;col++)
putchar (cr);
putchar ('\n');
}
}
此程序也只運行一次就退出了,其問題還是出現在gethcar ()會讀取包含換行符在內的所有字符,是緊跟在第一個輸入行的最後的那個換行符。scanf ()函數將該換行符留在了輸入隊列中,與sconf ()不同。getchar()並不路過換行符。所以循環的下一個週期,在你有機會輸入內容之前,這一換行由getchar()讀出,然後賦值給ch,而ch爲換行符正是一個終止循環的條件。要解決這一問題,該程序必須跳過一個輸入週期中鍵入的最後一個數字與下一行開始處鍵入的字符之間所有換行或空格,另外,如果除了gechar()判斷之外還可以在scanf()階段終止該程序。改定後如下:
//8-6.c
#include <stdio.h>
void display (char cr,int lines,int width);
int main (void)
{
int ch;
int rows,cols;
printf ("Enter a character and two integers :\n");
while ((ch = getchar()) != '\n')
{
if (scanf ("%d %d",&rows,&cols) != 2)
break;
display (ch,rows,cols);
while (getchar () != '\n')
continue;
printf ("Enter anoter charcter and two integers:\n");
printf ("Enter a newline to quit. \n");
}
printf ("Bye. \n");
return 0;
}
void display (char cr,int lines,int width)
{
int row ,col;
for (row = 1;row <= lines ;row++)
{
for (col = 1;col <= width;col++)
putchar (cr);
putchar ('\n');
}
}
while語句使程序剔除 scanf()輸入後的所有字符。然後通過使用一if語句和一個break判斷輸入的是不是兩個整數。