標準輸入輸出

<span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">首先,這兩個函數不是C標準庫中的函數,</span>

int getch(void)    //從標準輸入讀入一個字符,當你用鍵盤輸入的時候,屏幕不顯示你所輸入的字符。也就是,不帶回顯。
int getche(void)    //從標準輸入讀入一個字符,鍵盤輸入的時候,屏幕顯示所輸入的字符。帶回顯。

這兩個函數包含在頭文件conio.h中,需要記住的是conio.h不是C標準庫中的頭文件。Micorsoft 和 Borland的 C編譯器提供了conio.h,用來創建控制檯文本用戶界面。一般在Windows系統下安裝了VS、VC等,就可以包含conio.h頭文件。但是一般在Unix、Linux系統中,/usr/include/中都沒有這個頭文件。

getch和getche在等待用戶從鍵盤輸入的時候,用戶按下一個鍵後,不需要按回車,程序自動往下執行。在Linux中,終端輸入在缺省情況下是被“一鍋端”的,也就是說整行輸入是被一起處理的。通常,這是一種人們所希望的方便的辦法,但它也意味着在讀入數據時必須按一下回車鍵表示輸入行結束後才能得到輸入的數據。在遊戲中,很多都提供了“老闆鍵”,它的實現,就是利用了這兩個函數。

 

其次,除了getch和getche,其他的都是C標準庫中的頭文件,包含在頭文件stdio.h中。

int fgetc ( FILE * stream ); //從流stream中讀一個字符。可以將標準輸入stdin作爲它的實參,這時候從標準輸入讀取一個字符。
int getc(FILE * stream);     //和fgetc等效,由fgetc通過宏實現。
int getchar ( void );     //從標準輸入stdin讀入一個字符,程序等待你輸入的時候,你可以輸入多個字符,回車後程序繼續執行。
                                 //但getchar只讀入一個字符
說明:getc、getchar都是通過宏定義藉助fgetc實現。如getchar的實現爲,#define getchar() fgetc(stdin)。
 
char * fgets (char * str, int num, FILE *stream);
                 //從流stream中讀入最多num個字符到字符數組str中,當遇到換行符時、或讀到num-1個字符時停止。
                 //自動加上'\0'空字符結尾
char * gets ( char * str ); //從標準輸入stdin讀取一個字符串,遇到換行或結束時候終止。
                 //不同於fgets,他沒有指定num,所以需要注意字符數組str的大小。
 
說明: fgets和gets之間沒有宏定義的關係,彼此各自有自己的實現。蠕蟲病毒的實現就是函數gets的“功勞”。gets函數的任務是從流中讀入一個字符串。它的調用者會告訴它把讀入的字符串放在什麼地方。但是,gets()函數並不檢查緩衝區大小,如果調用者提供了一個指向堆棧的指針,並且get()函數讀入的字符數量超過了超過了緩衝區的空間大小,get()會愉快地將多出來的字符繼續寫入到堆棧中,這就覆蓋了堆棧中原來的內容。如:
main()
{
   
char line[512];    //在程序的堆棧上分配512個字符的空間
   ...
   gets(line);        
//蠕蟲病毒的入口,可以將惡意代碼通過多出來的數據寫入堆棧
}

 

建議不要用getch和getche,因爲它們不是C標準庫中的函數。用它們寫出的程序可移植性差,不同的編譯器不保證可以包含conio.h。建議用fgets函數徹底替代gets函數。

 

另外,絕大多數的這些get函數,都有對應的put版本。

int fputc ( int character, FILE * stream );

int putc ( int character, FILE * stream );       //通過宏定義和fputc實現

int putchar ( int character );        //通過宏定義實現:#define putchar(c) fputc(c, stdout)

 

int fputs ( const char * str, FILE * stream );

int puts ( const char * str );

說明:兩者之間無宏定義實現關係。puts(const char *str)近似等效於fputs(cosnt char *str, stdout),不同點是前者還輸出一個'\n'

 

最後,關於EOF

EOF是在stdio.h文件中定義的符號常量,值爲-1。如,

fputc函數返回一個值:如果輸出成功則返回值就是輸出的字符;如果輸出失敗,則返回一個EOF。 

fgetc函數讀字符時遇到文件結束符,函數返回一個文件結束標記EOF。如果想從一個磁盤文件順序讀入字符並在屏幕上顯示,可以:

ch = fgetc(fp);
while(ch != EOF){
  putchar(ch);
  ch 
= fgetc(fp);
}


注意,EOF不是可輸出字符,因此不能在屏幕上顯示。由於ASCII碼不可能出現-1,因此EOF定義爲-1是合適的。當讀入的字符值等於-1(即EOF)時,表示讀入的已不是正常的字符,而是文件結束符。但以上只適用於讀取文本文件的情況。現在ANSI C 已經允許用緩衝文件系統處理二進制文件,而讀入某一個字節中的二進制數據的值有可能是-1,而這又恰好是EOF的值。這就出現了需要讀入有用數據,卻處理爲“文件結束”。feof(fp) 用來測試fp所指向的文件當前狀態是否是“文件結束”。如果想順序讀入一個二進制文件數據,可以:

while(!feof(fp)){
   c 
= fgetc(fp);
   ...
}  

 

 


#include<iostream>
#include<stdio.h>

int main(){

/*	char str = 'a';
	FILE* fd;
	fd = fopen("D:\visual studio 2013\Projects\NewCode3\Hallo.txt", "r");
	if (fd == NULL)
	{
		printf("open file string.txt failed!\n");
		exit(1);
	}
*/
//===============單個字符操作=======================================
//	str = fgetc(fd);    //讀取一個字符,fgetc(FILE *stream);
//	fputc(str, fd);
//	fclose(fd);

//  str = getc(stdin);  //讀取一個字符,因爲getc(FILE *stream)是由fgetc()宏定義過來的
//	fputc(str, stdout);

//	str = getchar();    //讀取一個字符 ,因爲getchar是getc(stdin)的宏定義
//	putchar(str);
	
//==============字符串操作===========================================

	char* str1 = (char*)malloc(20);
	memset(str1, ' ', 20);
	char* str2 = (char*)malloc(20);
	memset(str2, ' ', 20);
/*	FILE *fdr,*fdw;
	fdr = fopen("D:\visual studio 2013\Projects\NewCode3\string.txt", "r");
	if (fdr == NULL)
	{
		printf("open file string.txt failed!\n");
		while (1);
		exit(1);
	}
	fdw = fopen("D:\visual studio 2013\Projects\NewCode3\stringWrite.txt", "w");
	if (fdw == NULL)
	{
		printf("open file stringWrite.txt failed!\n");
		while (1);
		exit(1);
	}
	fgets(str,20,fdr);//讀取FILE *fdr的文件。
	fputs(str,fdw);   //將fdr文件讀取出來,放到fdw中。
	fclose(fdr);
	fclose(fdw);
*/
	fputs(fgets(str1, 80, stdin), stdout);

//	str2=gets(str1); //fputs(fgets(str1, 80, stdin), stdout)因爲gets()是fgets()經過宏定義來的。
//	puts(str2);

}


詳情請查閱C標準庫。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章