在這篇文章中,我們來詳細聊一聊 C 語言標準輸入輸出頭文件 stdio.h
及其常見用法。
1. stdio.h
是什么
stdio.h
(Standard Input and Output Header)是 C 標準庫中的一個頭文件,提供了處理標準輸入輸出和一些文件操作的函數聲明。
它包含的主要功能有:
- 標準輸入輸出(
stdin
,stdout
,stderr
) - 格式化輸入輸出(
printf
,scanf
,fprintf
,fscanf
等) - 字符輸入輸出(
getchar
,putchar
,gets
,puts
等) - 文件讀寫(
fopen
,fclose
,fread
,fwrite
,fgets
,fputs
等) - 文件定位(
fseek
,ftell
,rewind
等) - 錯誤處理(
perror
,feof
,ferror
等)
2. 常見數據類型與宏
stdio.h
中不僅有函數聲明,還包含了一些類型定義和宏。
常見類型
FILE
- 用于表示一個文件流(File Stream)的結構體類型,內部存儲文件狀態、緩沖區等信息。
size_t
- 用于表示對象大小或存儲容量的無符號整數類型。
常見宏
NULL
:空指針常量。EOF
:文件結束標志(End Of File),通常值為-1
。BUFSIZ
:緩沖區大小常量。stdin
/stdout
/stderr
:分別表示標準輸入流、標準輸出流和標準錯誤流。
3. 常用輸入輸出函數
3.1 格式化輸出函數
#include <stdio.h>int printf(const char *format, ...);
int fprintf(FILE *stream, const char *format, ...);
int sprintf(char *str, const char *format, ...);
int snprintf(char *str, size_t size, const char *format, ...);
printf
→ 向標準輸出打印數據。fprintf
→ 向指定文件流打印數據。sprintf
→ 將格式化后的數據存入字符串(不安全,可能溢出)。snprintf
→ 將格式化數據存入字符串,并限制最大長度(推薦替代sprintf
)。
示例:
#include <stdio.h>
int main() {int age = 25;printf("年齡: %d\n", age);return 0;
}
3.2 格式化輸入函數
int scanf(const char *format, ...);
int fscanf(FILE *stream, const char *format, ...);
int sscanf(const char *str, const char *format, ...);
scanf
→ 從標準輸入讀取數據。fscanf
→ 從指定文件流讀取數據。sscanf
→ 從字符串中讀取數據。
示例:
#include <stdio.h>
int main() {int num;printf("請輸入一個數字: ");scanf("%d", &num);printf("你輸入的數字是: %d\n", num);return 0;
}
?? 注意:
scanf
在讀取字符串時容易發生緩沖區溢出,推薦用fgets
等更安全的函數。
3.3 字符輸入輸出
int getchar(void); // 從 stdin 讀取一個字符
int putchar(int c); // 輸出一個字符到 stdout
char *gets(char *s); // 從 stdin 讀取一行(不安全,已被移除 C11)
char *fgets(char *s, int n, FILE *stream); // 更安全的讀取字符串
int puts(const char *s); // 輸出字符串并換行
示例:
#include <stdio.h>
int main() {char name[20];printf("請輸入你的名字: ");fgets(name, sizeof(name), stdin);printf("你好, %s", name);return 0;
}
3.4 文件操作函數
FILE *fopen(const char *filename, const char *mode);
int fclose(FILE *stream);
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
char *fgets(char *s, int n, FILE *stream);
int fputs(const char *s, FILE *stream);
int fprintf(FILE *stream, const char *format, ...);
示例:
#include <stdio.h>
int main() {FILE *fp = fopen("test.txt", "w");if (fp == NULL) {perror("文件打開失敗");return 1;}fprintf(fp, "Hello, 文件!\n");fclose(fp);return 0;
}
3.5 文件定位函數
int fseek(FILE *stream, long offset, int whence); // 定位文件指針
long ftell(FILE *stream); // 獲取當前文件指針位置
void rewind(FILE *stream); // 重置文件指針到開頭
3.6 錯誤與結束檢測
void perror(const char *s); // 打印最近的錯誤信息
int feof(FILE *stream); // 檢測文件是否到達 EOF
int ferror(FILE *stream); // 檢測文件操作是否發生錯誤
4. 使用注意事項
- 安全性
- 避免使用
gets
(已廢棄) - 使用
fgets
+ 手動去除換行符代替
- 避免使用
- 緩沖區問題
stdin
默認行緩沖模式,stdout
默認行緩沖(終端時)/全緩沖(文件時)
- 文件操作后記得關閉
fclose(fp);
- 檢查返回值
- 輸入輸出函數失敗時會返回特殊值,比如
EOF
或負數。
- 輸入輸出函數失敗時會返回特殊值,比如
5. 小結
stdio.h
是 C 語言 IO 功能的核心頭文件。- 核心用途:格式化輸入輸出、字符輸入輸出、文件操作等。
- 常用函數:
printf
、scanf
、fgets
、fopen
、fclose
、fread
、fwrite
。 - 需要注意安全性和返回值的檢查。