從我先前的評論繼續,存在使用read
和write
和使用像fgets
和printf
更高層次的功能,以stdin
閱讀和寫作之間的真正差別不大。主要區別在於,您不能依賴可變參數printf
提供的格式字符串以及read
,因此您有責任使用返回來知道實際讀取了多少個字符。
下面是表示從stdin
與read
讀取輸入,然後編寫信息反饋與write
(注意基礎知識很短的例子:有你應該增加像檢查的字符數讀額外的檢查小於知道是否還有更多字符需要讀取的緩衝區的大小等等)。您可以將大部分提示和read
放入一個函數中,以緩解重複使用。
隨着write
,只記得,你寫的東西stdout
的順序是的格式字符串。因此只需簡單地調用write
即可完成您所需的格式。雖然您可以自由使用STDIN_FILENO
定義,你也可以簡單地使用0 - stdin
,1 - stdout
和2 - stderr
:
#include <unistd.h>
#define MAXC 256
int main (void) {
char buf[MAXC] = {0};
ssize_t nchr = 0;
/* write the prompt to stdout requesting input */
write (1, "\n enter text : ", sizeof ("\n enter text : "));
/* read up to MAXC characters from stdin */
if ((nchr = read (0, buf, MAXC)) == -1) {
write (2, "error: read failure.\n", sizeof ("error: read failure.\n"));
return 1;
}
/* test if additional characters remain unread in stdin */
if (nchr == MAXC && buf[nchr - 1] != '\n')
write (2, "warning: additional chars remain unread.\n",
sizeof ("warning: additional chars remain unread.\n"));
/* write the contents of buf to stdout */
write (1, "\n text entered: ", sizeof ("\n text entered: "));
write (1, buf, nchr-1);
write (1, "\n\n", sizeof ("\n\n"));
return 0;
}
編譯
gcc -Wall -Wextra -o bin/read_write_stdin read_write_stdin.c
輸出
$ ./bin/read_write_stdin
enter text : The quick brown fox jumps over the lazy dog!
text entered: The quick brown fox jumps over the lazy dog!
最簡單的方法可能一次只讀一個字符如果你得到一個換行符,將字符附加到數組中。 –
如果你想從標準輸入讀取,你不需要事先指定數組的大小嗎?我明白你的意思,但我不知道如何實施它。 – user3538161
使用'read/write'來完成輸入/輸出和使用'getchar/printf'確實沒有什麼區別。主要區別是您不喜歡格式化輸出或可變打印功能。您必須按照您希望的輸出方式將每個輸出寫入'stdout'來進行格式化。如果你仍然堅持讓我知道。你可以像使用任何文件一樣在'stdin'上使用read。你聲明一個緩衝區(數組)並從'stdin'讀入緩衝區。 'read'返回給你成功讀取的字符數。 –