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');
}
}