C 语言标准输入输出库:`stdio.h` 的使用详解
1. 概述
在 C 语言中,stdio.h
(Standard Input Output Header)是一个标准库头文件,主要用于提供输入与输出功能。几乎所有的 C 程序都会用到它,因为它定义了用于读取、写入、格式化、文件操作等常用函数。
要在程序中使用它,需要在源文件顶部引入:
#include <stdio.h>
引入后,就可以使用 stdio.h
中定义的函数、类型和宏。
2. 常见功能分类
stdio.h
的功能可以大致分为五大类:
- 标准输入/输出(终端 I/O)
- 格式化输入/输出(
printf
/scanf
等) - 字符与字符串输入/输出
- 文件输入/输出
- 错误处理宏与常量
3. 标准输入输出流
在 stdio.h
中定义了三个标准数据流:
名称 | 类型 | 用途 |
---|---|---|
stdin | FILE* | 标准输入流(默认键盘输入) |
stdout | FILE* | 标准输出流(默认控制台输出) |
stderr | FILE* | 标准错误流(默认错误输出) |
这些可以直接用于 printf
、fprintf
、scanf
、fscanf
等函数操作。
4. 常用函数详解
4.1 格式化输出函数
printf
- 输出格式化到标准输出
#include <stdio.h>int main() {int a = 10;float b = 3.14;printf("a = %d, b = %.2f\n", a, b);return 0;
}
%d
:整型%f
:浮点型%s
:字符串%c
:字符%.2f
:保留两位小数
fprintf
- 输出到文件流
fprintf(stdout, "Hello %s\n", "World");
fprintf(stderr, "Error: invalid input\n");
sprintf
/ snprintf
- 输出到字符串
char buf[50];
sprintf(buf, "Sum = %d", 5 + 3);
snprintf
带长度限制,安全性更好。
4.2 格式化输入函数
scanf
- 从标准输入读取格式化数据
int x;
scanf("%d", &x);
fscanf
- 从文件流读取格式化数据
FILE *fp = fopen("data.txt", "r");
int n;
fscanf(fp, "%d", &n);
sscanf
- 从字符串读取数据
char str[] = "100 3.14";
int a; float f;
sscanf(str, "%d %f", &a, &f);
4.3 字符输入输出函数
getchar
/ putchar
char c = getchar(); // 从 stdin 读取一个字符
putchar(c); // 输出到 stdout
gets
(已废弃)/ fgets
char buf[100];
fgets(buf, sizeof(buf), stdin); // 安全读取字符串
puts
puts("Hello World"); // 自动换行
4.4 文件输入输出函数
使用文件 I/O 需要理解 FILE
结构体,FILE*
是指向文件对象的指针。
打开和关闭文件
FILE *fp = fopen("test.txt", "w"); // w: 写模式
if (!fp) {perror("File open error");return 1;
}
fclose(fp);
常见文件打开模式:
模式 | 说明 |
---|---|
"r" | 读模式(文件必须存在) |
"w" | 写模式(清空原文件) |
"a" | 追加模式 |
"r+" | 读写模式 |
"w+" | 清空写读模式 |
"a+" | 追加读写模式 |
二进制模式
"rb"
,"wb"
,"ab"
等
文件读取函数
char buf[100];
fgets(buf, sizeof(buf), fp); // 读取一行
fread(buf, 1, 50, fp); // 按字节读取
文件写入函数
fprintf(fp, "Hello File\n");
fwrite(buf, 1, strlen(buf), fp);
文件定位
fseek(fp, 0, SEEK_SET); // 移动到文件开头
ftell(fp); // 获取当前偏移量
rewind(fp); // 回到文件开头
4.5 错误处理
perror
/ feof
/ ferror
FILE *fp = fopen("nofile.txt", "r");
if (!fp) {perror("Open file error"); // 输出描述性错误
}
5. 常用宏与类型
stdio.h
中定义了:
EOF
:通常是-1
,表示文件结束或输入错误NULL
:空指针常量size_t
:无符号整数类型(用于数组、文件大小)
6. 注意事项与最佳实践
- 避免使用不安全函数
- 不要使用
gets
,改用fgets
sprintf
改用snprintf
- 不要使用
- 检查文件操作返回值
- 确保
fopen
成功后再使用文件
- 确保
- 使用缓冲机制
setbuf
或setvbuf
可以设置自定义缓冲,优化性能
- 正确关闭文件
- 使用
fclose
释放资源,防止内存泄漏
- 使用
- 格式化时谨慎类型匹配
printf
/scanf
格式化符应与变量类型严格匹配
7. 小结
stdio.h
是 C 语言中最基础、最常用的库之一,掌握它不仅能提高代码的输入输出效率,还能打下坚实的文件操作基础。在编写程序时,熟练使用 printf
、scanf
、fgets
、fprintf
等函数,以及安全地进行文件读写,是每个 C 程序员的必备技能。