当前位置: 首页 > news >正文

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 格式化输出函数

#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. 使用注意事项

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

5. 小结

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

相关文章:

  • 【KO】前端面试六
  • 【40页PPT】企业如何做好大数据项目的选型(附下载方式)
  • 利用背景图片定位套打档案封面
  • 当AI成了“历史笔迹翻译官”:Manus AI如何破解多语言手写文献的“密码锁”
  • 1200 SCL学习笔记
  • 【Java SE】抽象类与Object类
  • 51单片机-实现外部中断模块教程
  • SpringBoot3整合dubbo3客户端【最佳实践】
  • 编程刷题-染色题DFS
  • 【C标准库】详解<stdio.h>标准输入输出库
  • CUDA和torch的安装
  • 什么是多元线性回归,系数、自变量、因变量是什么,多元线性回归中的线性是什么
  • 多光谱相机检测石油石化行业的跑冒滴漏的可行性分析
  • 【yocto】Yocto Project 配置层(.conf)文件语法详解
  • calchash.exe和chckhash.exe计算pe文件hash值的两个实用小工具
  • 智慧零售漏扫率↓79%!陌讯多模态融合算法在智能收银与货架管理的实战解析
  • 双目密集匹配(stereo dense matching)
  • stack,queue以及deque的介绍
  • 深度学习中主流激活函数的数学原理与PyTorch实现综述
  • 【字母异位分组】
  • 随机森林1
  • 【机器学习深度学习】多模态学习
  • 【GaussDB】使用MySQL客户端连接到GaussDB的M-Compatibility数据库
  • 【85页PPT】数字化转型LIMS大型企业智能制造之LIMS实验室管理系统产品解决方案(附下载方式)
  • MVC模式在个人博客系统中的应用
  • 简单介绍计算机的工作过程
  • 激光雷达工作原理
  • 算法训练营day59 图论⑨ dijkstra(堆优化版)精讲、Bellman_ford 算法精讲
  • C++初阶(2)C++入门基础1
  • 第1篇:走进日志框架的世界 - 从HelloWorld到企业级应用