\n 結尾)與 二進位流(原始位元組)| 流 | 檔案指標 | 檔案描述符 | 預設裝置 | 緩衝模式 |
|---|---|---|---|---|
| 標準輸入 | stdin | 0 (STDIN_FILENO) | 終端機 | 行緩衝 |
| 標準輸出 | stdout | 1 (STDOUT_FILENO) | 終端機 | 行緩衝 |
| 標準錯誤 | stderr | 2 (STDERR_FILENO) | 終端機 | 無緩衝 |
程式啟動自動開啟,正常結束時自動 fclose 並沖洗緩衝區。
\n 執行 I/O(終端機輸入輸出預設)setbuf(fp, NULL))void setbuf(FILE *fp, char *buf); // buf=NULL 關閉緩衝 int setvbuf(FILE *fp, char *buf, int mode, size_t size); // mode: _IOFBF(全), _IOLBF(行), _IONBF(無) // 必須在檔案開啟後、任何操作前呼叫
int getc(FILE*); int fgetc(FILE*); int getchar(void); // getchar() ≡ getc(stdin) int putc(int, FILE*); int fputc(int, FILE*); int putchar(int); // putchar(c) ≡ putc(c, stdout) // getc/putc 可能為巨集,fgetc/fputc 保證為函數
char *fgets(char *str, int n, FILE *fp); // 讀最多 n-1 字元,含 \n // gets() 不安全,禁用 int fputs(const char *str, FILE *fp); // 寫字串,不寫 \0 int puts(const char *str); // 寫字串 + 自動加 \n
int printf(const char *fmt, ...); int fprintf(FILE *fp, const char *fmt, ...); int sprintf(char *buf, const char *fmt, ...); int snprintf(char *buf, size_t n, const char *fmt, ...); int scanf(const char *fmt, ...); int fscanf(FILE *fp, const char *fmt, ...); int sscanf(const char *buf, const char *fmt, ...);
C 標準未定義輸入流 fflush 行為。VC 允許,GCC/Clang 無效,不可移植。
關閉緩衝,但非標準保證行為,不建議依賴。
int c; while ((c = getchar()) != '\n' && c != EOF);
循環讀取直到換行或 EOF,標準、可移植、無副作用。
scanf("%*[^\n]%*c"); // 讀取並丟棄非換行字元,再丟棄換行符
但留下換行符需額外處理,易出錯,不推薦常用。
<stdarg.h> 巨集(va_list、va_start、va_arg、va_end)遍歷參數write() 系統呼叫輸出fgets/fputs + 手動處理 \n 最穩健fread/fwrite 區塊 I/Oscanf/printf(格式解析開銷大)