[C语言日寄] <stdio.h> 头文件功能介绍

在C语言的世界里,<stdio.h> 是一个极其重要的头文件,它提供了标准输入输出功能,是C语言程序与用户交互的核心工具。今天,我们就来深入探讨 <stdio.h> 的功能、使用注意事项以及它的拓展应用。

功能介绍

<stdio.h> 是C语言标准库中的一个核心头文件,它定义了一系列用于输入输出操作的函数、宏和数据类型。这些功能使得程序能够与外部设备(如键盘、显示器、文件等)进行交互。

标准输入输出函数

<stdio.h> 提供了多种用于标准输入输出的函数,这些函数是C语言程序与用户交互的基础。

1. printfscanf

printfscanf 是最常用的输入输出函数。printf 用于格式化输出,它可以根据指定的格式将数据输出到标准输出设备(通常是屏幕)。scanf 用于格式化输入,它可以从标准输入设备(通常是键盘)读取数据,并将其存储到变量中。

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

putsgets 是用于字符串输入输出的函数。puts 用于输出字符串,它会自动在字符串末尾添加换行符。gets 用于从标准输入读取字符串,但它已经被弃用,因为它存在缓冲区溢出的风险。取而代之的是 fgets,它允许指定缓冲区大小,从而避免溢出。

#include <stdio.h>int main() {char str[100];printf("请输入一个字符串:");fgets(str, sizeof(str), stdin); // 安全的字符串输入printf("你输入的字符串是:%s", str);return 0;
}
3. fprintffscanf

fprintffscanf 是文件输入输出函数的扩展版本。它们与 printfscanf 类似,但可以指定输出或输入的目标文件。这使得程序能够从文件读取数据或将数据写入文件。

#include <stdio.h>int main() {FILE *file = fopen("example.txt", "w");if (file) {fprintf(file, "Hello, World!\n");fclose(file);}file = fopen("example.txt", "r");if (file) {char buffer[100];fscanf(file, "%s", buffer);printf("文件内容:%s\n", buffer);fclose(file);}return 0;
}

文件操作函数

<stdio.h> 提供了丰富的文件操作功能,这些功能使得程序能够对文件进行读写、打开、关闭等操作。

1. fopenfclose

fopen 用于打开一个文件,它需要指定文件名和打开模式(如读模式 "r"、写模式 "w"、追加模式 "a" 等)。fclose 用于关闭文件,释放与文件相关的资源。

#include <stdio.h>int main() {FILE *file = fopen("example.txt", "w");if (file) {fprintf(file, "Hello, World!\n");fclose(file);}return 0;
}
2. freadfwrite

freadfwrite 用于从文件中读取或向文件中写入数据块。它们允许指定读取或写入的数据大小和数量,适合处理二进制文件。

#include <stdio.h>int main() {FILE *file = fopen("example.bin", "wb");if (file) {int data = 12345;fwrite(&data, sizeof(data), 1, file);fclose(file);}file = fopen("example.bin", "rb");if (file) {int data;fread(&data, sizeof(data), 1, file);printf("文件中的数据:%d\n", data);fclose(file);}return 0;
}

格式化输入输出函数

<stdio.h> 提供了多种格式化输入输出函数,这些函数使得程序能够以灵活的方式处理输入输出。

1. sprintfsscanf

sprintfsscanf 是字符串格式化输入输出函数。sprintf 将格式化的数据写入字符串,而 sscanf 从字符串中读取格式化的数据。

#include <stdio.h>int main() {char buffer[100];int num = 123;sprintf(buffer, "数字:%d", num);printf("格式化后的字符串:%s\n", buffer);sscanf(buffer, "数字:%d", &num);printf("从字符串中读取的数字:%d\n", num);return 0;
}

其他功能

<stdio.h> 还提供了一些其他功能,如清除输入缓冲区、设置文件位置指针等。

1. fflush

fflush 用于清除输出缓冲区,将缓冲区中的数据写入目标设备。它通常用于确保数据被及时写入文件或屏幕。

#include <stdio.h>int main() {printf("Hello, World!");fflush(stdout); // 确保输出被立即写入return 0;
}
2. fseekftell

fseekftell 用于设置和获取文件位置指针。fseek 可以将文件位置指针移动到指定位置,而 ftell 返回当前文件位置指针的位置。

#include <stdio.h>int main() {FILE *file = fopen("example.txt", "r");if (file) {fseek(file, 0, SEEK_END); // 移动到文件末尾long fileSize = ftell(file); // 获取文件大小printf("文件大小:%ld 字节\n", fileSize);fclose(file);}return 0;
}

注意事项

虽然 <stdio.h> 提供了强大的输入输出功能,但在使用过程中需要注意一些问题,以避免潜在的错误和安全隐患。

1. 输入缓冲区溢出

gets 函数已经被弃用,因为它存在缓冲区溢出的风险。取而代之的是 fgets,它允许指定缓冲区大小,从而避免溢出。

char buffer[100];
fgets(buffer, sizeof(buffer), stdin); // 安全的字符串输入

2. 文件打开失败的处理

在使用 fopen 打开文件时,需要检查文件是否成功打开。如果文件打开失败,fopen 会返回 NULL,此时需要进行错误处理。

FILE *file = fopen("example.txt", "r");
if (!file) {perror("文件打开失败");return 1;
}

3. 文件关闭的必要性

在完成文件操作后,必须调用 fclose 关闭文件。如果文件没有被正确关闭,可能会导致数据丢失或文件损坏。

fclose(file);

4. 格式化字符串的安全性

在使用 printfscanf 等格式化函数时,需要确保格式化字符串与变量类型匹配。不匹配的格式化字符串可能导致未定义行为。

int num = 123;
printf("数字:%d\n", num); // 正确的格式化字符串

5. 文件位置指针的使用

在使用 fseekftell 时,需要注意文件位置指针的移动方式。SEEK_SET 表示从文件开头开始计算,SEEK_CUR 表示从当前位置开始计算,SEEK_END 表示从文件末尾开始计算。

fseek(file, 0, SEEK_SET); // 移动到文件开头

拓展应用

<stdio.h> 的功能不仅限于基本的输入输出操作,它还可以用于实现一些高级功能,如日志记录、文件加密、数据序列化等。

日志记录是程序开发中常见的需求,<stdio.h> 提供了实现日志记录的基础功能。通过将日志信息写入文件,可以方便地记录程序的运行状态。

#include <stdio.h>
#include <time.h>void log_message(const char *message) {FILE *logFile = fopen("log.txt", "a");if (logFile) {time_t now =

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/9630.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二进制安卓清单 binary AndroidManifest - XCTF apk 逆向-2

XCTF 的 apk 逆向-2 题目 wp&#xff0c;这是一道反编译对抗题。 题目背景 AndroidManifest.xml 在开发时是文本 xml&#xff0c;在编译时会被 aapt 编译打包成为 binary xml。具体的格式可以参考稀土掘金 MindMac 做的类图&#xff08;2014&#xff09;&#xff0c;下面的博…

AboutDialog组件的功能和用法

文章目录 1 概念介绍2 使用方法3 示例代码 我们在上一章回中介绍了AlertDialog Widget相关的内容,本章回中将介绍AboutDialog Widget.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1 概念介绍 我们在这里说的AboutDialog是一种弹出式窗口&#xff0c;和上一章回中介绍的Al…

计算机网络 IP 网络层 2 (重置版)

IP的简介&#xff1a; IP 地址是互联网协议地址&#xff08;Internet Protocol Address&#xff09;的简称&#xff0c;是分配给连接到互联网的设备的唯一标识符&#xff0c;用于在网络中定位和通信。 IP编制的历史阶段&#xff1a; 1&#xff0c;分类的IP地址&#xff1a; …

关于产品和技术架构的思索

技术架构或者设计应该和产品设计分离&#xff0c;但是又不应该和产品架构独立。 听起来非常的绕并且难以理解。 下面我们用一个例子来解读这两者的关系 产品&#xff08;族谱图&#xff09; 如果把人类当作产品&#xff0c;那设计师应该是按照上面设计的(当然是正常的伦理道德)…

第十四讲 JDBC数据库

1. 什么是JDBC JDBC&#xff08;Java Database Connectivity&#xff0c;Java数据库连接&#xff09;&#xff0c;它是一套用于执行SQL语句的Java API。应用程序可通过这套API连接到关系型数据库&#xff0c;并使用SQL语句来完成对数据库中数据的查询、新增、更新和删除等操作…

蓝牙技术在物联网中的应用有哪些

蓝牙技术凭借低功耗、低成本和易于部署的特性&#xff0c;在物联网领域广泛应用&#xff0c;推动了智能家居、工业、医疗、农业等多领域发展。 智能家居&#xff1a;在智能家居系统里&#xff0c;蓝牙技术连接各类设备&#xff0c;像智能门锁、智能灯泡、智能插座、智能窗帘等。…

Visual Studio Code修改terminal字体

个人博客地址&#xff1a;Visual Studio Code修改terminal字体 | 一张假钞的真实世界 默认打开中断后字体显示如下&#xff1a; 打开设置&#xff0c;搜索配置项terminal.integrated.fontFamily&#xff0c;修改配置为monospace。修改后效果如下&#xff1a;

开发环境搭建-4:WSL 配置 docker 运行环境

在 WSL 环境中构建&#xff1a;WSL2 (2.3.26.0) Oracle Linux 8.7 官方镜像 基本概念说明 容器技术 利用 Linux 系统的 文件系统&#xff08;UnionFS&#xff09;、命名空间&#xff08;namespace&#xff09;、权限管理&#xff08;cgroup&#xff09;&#xff0c;虚拟出一…

71-《颠茄》

颠茄 颠茄&#xff0c;别名&#xff1a;野山茄、美女草、别拉多娜草&#xff0c;拉丁文名&#xff1a;Atropa belladonna L.是双子叶植物纲、茄科、颠茄属多年生草本&#xff0c;或因栽培为一年生&#xff0c;根粗壮&#xff0c;圆柱形。茎下部单一&#xff0c;带紫色&#xff…

2025 = 1^3 + 2^3 + 3^3 + 4^3 + 5^3 + 6^3 + 7^3 + 8^3 + 9^3

【算法代码】 #include <bits/stdc.h> using namespace std;int year2025; int main() {cout<<year<<" ";int i1;while(year) {cout<<i<<"^3";if(i<9) cout<<" ";year-pow(i,3);i;}return 0; }/* 202…

三天急速通关JavaWeb基础知识:Day 1 后端基础知识

三天急速通关JavaWeb基础知识&#xff1a;Day 1 后端基础知识 0 文章说明1 Http1.1 介绍1.2 通信过程1.3 报文 Message1.3.1 请求报文 Request Message1.3.2 响应报文 Response Message 2 XML2.1 介绍2.2 利用Java解析XML 3 Tomcat3.1 介绍3.2 Tomcat的安装与配置3.3 Tomcat的项…

Baklib揭示内容中台与人工智能技术的创新协同效应

内容概要 在当今信息爆炸的时代&#xff0c;内容的高效生产与分发已成为各行业竞争的关键。内容中台与人工智能技术的结合&#xff0c;为企业提供了一种新颖的解决方案&#xff0c;使得内容创造的流程更加智能化和高效化。 内容中台作为信息流动的核心&#xff0c;能够集中管…

Git进阶之旅:Git 配置信息 Config

Git 配置级别&#xff1a; 仓库级别&#xff1a;local [ 优先级最高 ]用户级别&#xff1a;global [ 优先级次之 ]系统级别&#xff1a;system [ 优先级最低 ] 配置文件位置&#xff1a; git 仓库级别对应的配置文件是当前仓库下的 .git/configgit 用户级别对应的配置文件时用…

Java中的泛型

泛型&#xff1a;是DK5中引入的特性&#xff0c;可以在编译阶段约束操作的数据类型&#xff0c;并进行检查。 泛型的格式&#xff1a;<数据类型> 注意&#xff1a;泛型只能支持引用数据类型。 没有泛型如何储存数据&#xff1a; 弊端&#xff1a;多态不能访问子类的特…

C++/stack_queue

目录 1.stack 1.1stack的介绍 1.2stack的使用 练习题&#xff1a; 1.3stack的模拟实现 2.queue的介绍和使用 2.1queue的介绍 2.2queue的使用 2.3queue的模拟实现 3.priority_queue的介绍和使用 3.1priority_queue的介绍 3.2priority_queue的使用 欢迎 1.stack 1.1stack…

mysql.sock.lock 导致mysql重启失败

背景 今天公司物业断电&#xff0c;导致机房服务器停电宕机&#xff0c;所有的服务都得重启。本着mysql实例都做了服务自启动&#xff0c;所以没有太担心影响开发的日常工作。但是今天一上班开发就找来&#xff0c;各种服务都没起来有问题&#xff0c;数据库连不上。马上登陆数…

Hive:Hive Shell技巧

在终端命令窗口不能直接执行select,creat等HQL命令,需要先进入hive之后才能执行,比较麻烦,但是如果使用Hive Shell就可以直接执行 在终端只执行一次Hive命令 -e 参数, "execute"&#xff08;执行&#xff09;,使用-e参数后会在执行完Hive的命令后退出Hive 使用场景:…

C++:PTA L2-003 月饼

月饼是中国人在中秋佳节时吃的一种传统食品&#xff0c;不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量&#xff0c;请你计算可以获得的最大收益是多少。 注意&#xff1a;销售时允许取出一部分库存。样例给出的情形是这样的&#…

力扣面试150 快乐数 循环链表找环 链表抽象 哈希

Problem: 202. 快乐数 &#x1f469;‍&#x1f3eb; 参考题解 Code public class Solution {public int squareSum(int n) {int sum 0;while(n > 0){int digit n % 10;sum digit * digit;n / 10;}return sum;}public boolean isHappy(int n) {int slow n, fast squa…

春晚舞台上的人形机器人:科技与文化的奇妙融合

文章目录 人形机器人Unitree H1的“硬核”实力传统文化与现代科技的创新融合网友热议与文化共鸣未来展望&#xff1a;科技与文化的更多可能结语 2025 年央视春晚的舞台&#xff0c;无疑是全球华人目光聚焦的焦点。就在这个盛大的舞台上&#xff0c;一场名为《秧BOT》的创意融合…