c primer plus 專題8:字符輸入 / 輸出

1 單字符I / O

1 常用的單字符IO函數  getchar() 和 putchar()

#include<stdio.h>
int main(void) 
{
	char ch;

	while ((ch = getchar()) != '#')
		putchar(ch);

	return 0;
}

執行結果

1234 abcd
1234 abcd
qwertyuiop!@$%^&*
qwertyuiop!@$%^&*

2 緩衝區

無緩衝系統中,輸入馬上回顯

爲什麼要有緩衝區?

1 把若干字符作爲一個塊進行傳輸,比逐個發送這些字符節約時間;2 如果用戶打錯字符,可以直接通過鍵盤修正錯誤。

緩衝輸入和無緩衝輸入的用途:

2 文件流

如何理解流?(知乎回答)

由於不同文件系統的描述差異(FAT32 NTFS),不同操作系統對文件結尾的定義(Mac系統以 \r 結尾,Linux系統以 \n 結尾,Windows系統以 \r\n 結尾)。C語言爲了能操作文件,必須屏蔽掉這些差異。引入了流的概念,C程序不直接處理文件,而是處理輸入輸出流。

3 文件結尾

1 操作系統如何識別文件結尾

2 C語言檢測文件結尾

下面是示例程序

程序說明

4 重定向和文件

1 什麼是重定向?

Unix、Linux和當前的DOS版本都能夠重定向輸入和輸出。輸入重定向可以使程序能夠使用文件代替鍵盤作爲輸入,輸出重定向則使程序能夠使用文件代替屏幕作爲輸出。

2 重定向輸入

之前的字符IO,都是鍵盤輸入,屏幕輸出。毫無疑問的,我們可以重定向輸入源,如文本輸入,鍵盤輸出。這樣做的效果,實際上就是打印文件的內容。如下所示:

待測試的文本文件

測試程序和之前一樣

#include<stdio.h>
int main(void) 
{
	char ch;

	while ((ch = getchar()) != EOF)
		putchar(ch);

	return 0;
}

在windows命令行工具cmd(powershell中無法執行)中運行,結果如下

3 重定向輸出

下面是執行流程

下面是生成的 out.txt 文本文件

4 組合重定向

所謂的組合重定向,通常是讀取一個文件作爲輸入流,然後輸出到令一個文件。

如果你希望創建一個 mywords 文件的副本,並命名爲 savewords,如下操作

primer.exe < mywords > savewords
       重定向輸入  重定向輸出

或者,我們可以實現文本最簡單的加密保存,程序如下所示

#include<stdio.h>
int main(void) 
{
	char ch;

	while ((ch = getchar()) != EOF)
	{
		/* 保留空格、下劃線和換行符 */
		if (ch == ' ' || ch == '_' || ch == '\r' || ch == '\n')
			putchar(ch);
		else 
			putchar(ch + 1);
	}

	return 0;
}

輸入文本內容如下

組合重定向過程

加密結果:

5 不通過命令行,通過輸入文件名來實現輸入重定向

#include <stdio.h>
#include <stdlib.h>				// 爲了使用 exit()
int main(void) 
{
	int ch;
	FILE *fp;
	char fname[40];				// 存儲文件名

	printf("Enter the name of file: ");
	scanf("%s", fname);
	fp = fopen(fname, "r");		// 打開待讀取文件
	if (fp == NULL)
	{
		printf("Feiled to open file. Bye!\n");
		exit(1);				// 退出程序
	}
	// getc(fp) 從打開的文件中,獲取一個字符
	while ((ch = getc(fp)) != EOF)
		putchar(ch);
	fclose(fp);					// 關閉文件

	return 0;
}

注意,getc(fp) 函數,用於從打開的文件中獲取字符。執行結果如下

 

5 創建友好用戶界面

執行結果:

解決方案

使用 while (getchar() != '\n');  跳過剩餘輸入行。

一定要牢記,輸入的字符按下 enter 後,最後會附帶 \n;所以,一定要使用 while (getchar() != '\n'); 幹掉 \n

混合數值和字符輸入

#include <stdio.h>
void display(char ch, int lines, int width);
int main(void) 
{
	int ch;
	int rows, cols;		

	printf("Enter a character and two integers: \n");
	while ((ch = getchar()) != '\n')			// 新行 enter 退出
	{
		if (scanf("%d%d", &rows, &cols) != 2)	// 獲取 2 個輸入
			break;
		while (getchar() != '\n')				// 跳過剩餘的字符
			continue;
		display(ch, rows, cols);
		printf("Enter another character and two integers: \n");
		printf("Enter a newline to quit.\n");
	}

	return 0;
}

void display(char ch, int lines, int width)		// 輸入字符按行列打印
{
	int row, col;

	for (row = 1; row <= lines; row++)
	{
		for (col = 1; col <= width; col++)
			putchar(ch);
		putchar('\n');
	}
}

 

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