C 语言标准输入输出头文件stdio.h及其常见用法
在这篇文章中,我们来详细聊一聊 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
。 - 需要注意安全性和返回值的检查。