C 语言标准输入输出头文件stdio.h及其常见用法

在这篇文章中,我们来详细聊一聊 C 语言标准输入输出头文件 stdio.h 及其常见用法。


1. stdio.h 是什么

stdio.h(Standard Input and Output Header)是 C 标准库中的一个头文件,提供了处理标准输入输出 和一些文件操作的函数声明。

它包含的主要功能有:

  1. 标准输入输出stdin, stdout, stderr
  2. 格式化输入输出printf, scanf, fprintf, fscanf 等)
  3. 字符输入输出getchar, putchar, gets, puts 等)
  4. 文件读写fopen, fclose, fread, fwrite, fgets, fputs 等)
  5. 文件定位fseek, ftell, rewind 等)
  6. 错误处理perror, feof, ferror 等)

2. 常见数据类型与宏

stdio.h 中不仅有函数声明,还包含了一些类型定义和宏。

常见类型

  • FILE
    • 用于表示一个文件流(File Stream)的结构体类型,内部存储文件状态、缓冲区等信息。
  • size_t
    • 用于表示对象大小存储容量的无符号整数类型。

常见宏

  • NULL:空指针常量。
  • EOF:文件结束标志(End Of File),通常值为 -1
  • BUFSIZ:缓冲区大小常量。
  • stdin / stdout / stderr:分别表示标准输入流、标准输出流和标准错误流。

3. 常用输入输出函数

3.1 格式化输出函数

c 复制代码
#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)。

示例:

c 复制代码
#include <stdio.h>
int main() {
    int age = 25;
    printf("年龄: %d\n", age);
    return 0;
}

3.2 格式化输入函数

c 复制代码
int scanf(const char *format, ...);
int fscanf(FILE *stream, const char *format, ...);
int sscanf(const char *str, const char *format, ...);
  • scanf → 从标准输入读取数据。
  • fscanf → 从指定文件流读取数据。
  • sscanf → 从字符串中读取数据。

示例:

c 复制代码
#include <stdio.h>
int main() {
    int num;
    printf("请输入一个数字: ");
    scanf("%d", &num);
    printf("你输入的数字是: %d\n", num);
    return 0;
}

⚠️ 注意:scanf 在读取字符串时容易发生缓冲区溢出,推荐用 fgets 等更安全的函数。


3.3 字符输入输出

c 复制代码
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);     // 输出字符串并换行

示例:

c 复制代码
#include <stdio.h>
int main() {
    char name[20];
    printf("请输入你的名字: ");
    fgets(name, sizeof(name), stdin);
    printf("你好, %s", name);
    return 0;
}

3.4 文件操作函数

c 复制代码
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, ...);

示例:

c 复制代码
#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 文件定位函数

c 复制代码
int fseek(FILE *stream, long offset, int whence); // 定位文件指针
long ftell(FILE *stream);                         // 获取当前文件指针位置
void rewind(FILE *stream);                        // 重置文件指针到开头

3.6 错误与结束检测

c 复制代码
void perror(const char *s); // 打印最近的错误信息
int feof(FILE *stream);     // 检测文件是否到达 EOF
int ferror(FILE *stream);   // 检测文件操作是否发生错误

4. 使用注意事项

  1. 安全性
    • 避免使用 gets(已废弃)
    • 使用 fgets + 手动去除换行符代替
  2. 缓冲区问题
    • stdin 默认行缓冲模式,stdout 默认行缓冲(终端时)/全缓冲(文件时)
  3. 文件操作后记得关闭
    • fclose(fp);
  4. 检查返回值
    • 输入输出函数失败时会返回特殊值,比如 EOF 或负数。

5. 小结

  • stdio.h 是 C 语言 IO 功能的核心头文件。
  • 核心用途:格式化输入输出、字符输入输出、文件操作等。
  • 常用函数:printfscanffgetsfopenfclosefreadfwrite
  • 需要注意安全性和返回值的检查。