【IO编程】标准IO和文件IO的对比

标准 I/O文件 I/O 是两种常见的输入输出操作方式。它们的核心功能都是处理数据流,但使用场景和实现方式有所不同,适用于不同的需求。

标准 I/O

标准 I/O 是指与标准输入、标准输出和标准错误流(分别为 stdin、stdout 和 stderr)交互的输入输出操作。这个通常用于程序与用户交互,例如从键盘读取数据或向终端打印输出。

标准 I/O 的通道:

  1. 标准输入 (stdin):默认从键盘获取输入。
  2. 标准输出 (stdout):默认向终端显示输出。
  3. 标准错误 (stderr):输出错误信息,默认也显示在终端。
#include <stdio.h>

int main() {
    char name[50];
    printf("Enter your name: ");  // 标准输出
    scanf("%s", name);            // 标准输入
    printf("Hello, %s!\n", name); // 标准输出
    return 0;
}
标准IO的特点:
	1>拥有缓冲区
	2>标准I0由C库提供-->头文件:stdio.h
	3>标准IO一般只做IO操作:输入/输出
标准IO的核心:
	结构体指针:FILE*
	--->在内存中开辟一个空间,用来接受fopen返回的文件信息,然后通过变量对文件进行I0操作
	-->流:stream
标准IO的API:	
	打开文件:fopen
	操作文件:操作较多
		一次操作一个字符:
					读:fgetc/getc/getchar
					写:fputc/putc/putchar
		一次操作一行字符:
					读:fgets/gets
					写:fputs/puts
		一次操作一块字符:
					读:fread
					写:fwrite
		关闭文件:fclose
	拓展函数:
		光标控制:
		fseek
		fte71
		rewind

文件 I/O

文件 I/O 是指通过文件操作函数对磁盘上的文件进行读写操作这通常用于持久化存储数据,例如读取配置文件、保存程序运行结果等。

#include <stdio.h>

int main() {
    FILE *file = fopen("example.txt", "w"); // 打开文件用于写入
    if (file == NULL) {
        perror("Error opening file");
        return 1;
    }

    fprintf(file, "Hello, File I/O!\n"); // 写入文件
    fclose(file);                        // 关闭文件
    return 0;
}
  • 标准 I/O 更适合用户交互和调试信息输出;

  • 文件 I/O 是处理磁盘数据和实现数据持久化的核心工具。

     文件IO的特点:
     	1>没有缓冲区
     	2>文件IO由系统底层提供	POSIX
     	3>文件I0除了可以做I0操作,也可以打开Linux的一些特殊文件:管道文件/套接字文件.....
     文件I0的核心:	
     	文件描述符:fd--->0、1、2:三个标准文件
     		是一种Linux用来标识正在打开的文件 的一种资源:类型为int,非0的取值
     		特征:优先分配最小目 未被使用的
     文件IO的API:	
     	打开文件:open
     		重点:
     			1>打开方式:
     				必选且互斥:
     					O_RDONLY		只读
     					O_WRONLY		只写
     					O_RDWR			可读可写
     				选项且多选:
     					O_CREAT			创建
     					O_EXCL			创建前判断是否存在
     					O_TRUNC			清空模式
     					O APPEND		追加模式
     			2>特殊的第三参:
     				open拥有两种传参方式:
     					1>两个参数:1>要打开的文件
     								2>打开方式
     					2>三个参数:1>要打开的文件
     								2>打开方式
     								3>创建时赋予的权限 -----****隐藏参,需要特定的条件开启
     					开启第三参的条件:打开方式中:拥有 O_CREAT
     		操作文件
     			读:read
     			写:write
     			操作逻辑:
     				1>读:从相应的文件描述符中读取相关的内容
     				2>写:将对应的数据写入到相应的文件描述符中
     				--->可以完成 一些通信类的操作
     						--->可以完成 一些通信类的操作
     			关闭文件:c1ose
     		拓展函数
     			1seek:光标控制
     			dup:文件描述符重定向
     			dup2:文件描述符重定向
    

标准 I/O 的典型使用场景
  • 用户交互:程序从用户输入中读取数据,并将结果输出到屏幕。示例:计算器程序、命令行工具。
  • 调试信息:使用标准错误流(stderr)打印程序运行时的错误日志或调试信息。
  • 简单的数据流操作:处理小规模的数据,比如读取一行输入或打印一段文本。
文件 I/O 的典型场景
  • 数据持久化:将程序运行的结果保存到文件中,以便后续使用。示例:日志文件、数据库文件。
  • 大规模数据处理:读取和处理磁盘上的大文件,如 CSV 数据、图片、视频等,将它们转化为二进制数据进行传输。
  • 配置文件:从文件中读取程序的配置参数,或将配置写回文件。
  • 文件编辑工具:文本编辑器或文件转换工具。
#include <stdio.h>

int main() {
    FILE *file = fopen("data.txt", "r");
    if (file == NULL) {
        perror("Error opening file");
        return 1;
    }

    char line[256];
    while (fgets(line, sizeof(line), file)) { // 从文件中逐行读取
        printf("%s", line);                  // 打印到标准输出
    }

    fclose(file); // 关闭文件
    return 0;
}
二者的共同点
  • 基于流的操作:无论是标准 I/O 还是文件 I/O,都通过流(FILE*)来操作数据。
  • 缓冲机制:都使用缓冲区提高 I/O 性能。标准 I/O 的缓冲区通常与终端交互频率相关,而文件 I/O 的缓冲区通常与磁盘块大小相关。
  • 错误处理:都通过函数返回值或错误流报告操作失败的原因。

标准 I/O 本质上是文件 I/O 的一种特殊形式。标准输入、标准输出和标准错误流在系统中对应以下文件描述符:

  • stdin -> 文件描述符 0
  • stdout -> 文件描述符 1
  • stderr -> 文件描述符 2

它们是操作系统在程序启动时默认打开的文件流,因此可以像普通文件一样操作。

#include <stdio.h>

int main() {
    FILE *file = fopen("output.txt", "w");
    if (file == NULL) {
        perror("Error opening file");
        return 1;
    }

    // 标准输出
    printf("This is standard output.\n");

    // 文件输出
    fprintf(file, "This is file output.\n");

    fclose(file);
    return 0;
}
性能对比
  • 标准 I/O 性能
    • 标准 I/O 主要用于交互式操作,数据量较小,性能通常不会成为瓶颈。
    • 由于标准输出默认是行缓冲,频繁的逐行输出会触发缓冲区刷新,可能会略微影响性能。
  • 文件 I/O 性能
    • 文件 I/O 涉及磁盘操作,其性能受文件大小、磁盘速度和文件系统的影响。
    • 文件 I/O 通常使用块缓冲(Block Buffering),一次性读写较大的数据块以提高性能。
    • 对于大规模数据处理,文件 I/O 的性能优化是关键,比如使用内存映射(Memory Mapping)技术代替传统文件读写。

二者的综合对比分析

属性标准 I/O文件 I/O
操作对象标准输入、输出和错误流(如终端)。磁盘上的文件。
数据来源/目标键盘(输入)、屏幕(输出)、错误日志等。文件(持久化存储)。
函数接口printf、scanf、putchar、getchar 等。fopen、fclose、fread、fwrite、fprintf 等。
存储特点数据是临时的,程序关闭后数据不保存;临时存储,程序关闭后数据会丢失。数据存储在磁盘文件中,可持久化;持久化存储,数据保存在磁盘上。
缓冲机制标准 I/O 使用流缓冲,通常实时刷新到终端。文件 I/O 使用文件缓冲,通常批量刷新到磁盘。
灵活性受限于标准输入输出,适合简单交互。更灵活,可操作任意文件,适合复杂数据读写。
性能适合小规模、即时交互,性能影响较小。需要文件系统支持,频繁文件操作可能导致性能瓶颈。
适用场景简单交互、用户输入输出、调试信息。数据持久化、大文件处理、复杂数据操作。
错误处理错误通过返回值或 stderr 流报告。错误通过函数返回值(如 NULL 或 EOF)报告。

综上。希望该内容能对你有帮助,感谢!

以上。仅供学习与分享交流,请勿用于商业用途!转载需提前说明。

我是一个十分热爱技术的程序员,希望这篇文章能够对您有帮助,也希望认识更多热爱程序开发的小伙伴。
感谢!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

系统思考—要素连接

“改变你的思维&#xff0c;就能改变你的世界”— 诺曼皮尔 世界上的所有事物&#xff0c;都在规律的支配下&#xff0c;以系统的方式运转。显性的部分是我们能看到的“要素”&#xff0c;而那些看不见的力量&#xff0c;正是推动系统运作的要素之间的相互作用。更隐秘的&…

云原生(1)

作业&#xff1a; 1、shell 脚本写出检测 /tmp/size.log 文件如果存在显示它的内容&#xff0c;不存在则创建一个文件将创建时间写入。 2、写一个 shel1 脚本,实现批量添加 20个用户,用户名为user01-20,密码为user 后面跟5个随机字符。 3、编写个shel 脚本将/usr/local 日录下大…

【IO编程】文件IO的API

这篇文章在 文章&#xff1a;【文件I/O】文件持久化 的基础之上&#xff0c;更进一步的描述了文件IO中更多更详细的API详解。 文件IO 文件IO操作是必须要理解的环节之一&#xff0c;因为 s&#xff1a;套接字文件 &#xff1b;p: 管道文件 —> 都需要通过文件IO来进行打开…

【数据库】Unity 使用 Sqlite 数据库

1.找到需要三个 DLL Mono.Data.Sqlite.dllSystem.Data.dllsqlite3.dll 上面两个dll可在本地unity安装目录找到&#xff1a; C:\Program Files\Unity\Hub\Editor\2022.3.xxf1c1\Editor\Data\MonoBleedingEdge\lib\mono\unityjit-win32 下面dll可在sqlite官网下载到&#xff…

省级-农业科技创新(农业科技专利)数据(2010-2022年)-社科数据

省级-农业科技创新&#xff08;农业科技专利&#xff09;数据&#xff08;2010-2022年&#xff09;-社科数据https://download.csdn.net/download/paofuluolijiang/90028570 https://download.csdn.net/download/paofuluolijiang/90028570 数据 年份、省份、农业科技专利数量…

51单片机——定时器中断(重点)

STC89C5X含有3个定时器&#xff1a;定时器0、定时器1、定时器2 注意&#xff1a;51系列单片机一定有基本的2个定时器&#xff08;定时器0和定时器1&#xff09;&#xff0c;但不全有3个中断&#xff0c;需要查看芯片手册&#xff0c;通常我们使用的是基本的2个定时器&#xff…

计算机的错误计算(二百零九)

摘要 利用两个大模型判断 是否为有理数&#xff1f;其值是多少&#xff1f;由实验知&#xff0c;其中一个大模型判断错误&#xff0c;说不是有理数&#xff1b;至于其值&#xff0c;该大模型选了一个错误的数值。 例1. e^(45*ln(24.8))是有理数吗&#xff1f;其值是多少&am…

Facebook 隐私变革之路:回顾与展望

在数字时代&#xff0c;个人隐私的保护一直是社交平台面临的重大挑战之一。作为全球最大的社交网络平台&#xff0c;Facebook&#xff08;现为Meta&#xff09;在处理用户隐私方面的变革&#xff0c;历经了多次调整与完善。本文将回顾Facebook在隐私保护方面的历程&#xff0c;…

第432场周赛:跳过交替单元格的之字形遍历、机器人可以获得的最大金币数、图的最大边权的最小值、统计 K 次操作以内得到非递减子数组的数目

Q1、跳过交替单元格的之字形遍历 1、题目描述 给你一个 m x n 的二维数组 grid&#xff0c;数组由 正整数 组成。 你的任务是以 之字形 遍历 grid&#xff0c;同时跳过每个 交替 的单元格。 之字形遍历的定义如下&#xff1a; 从左上角的单元格 (0, 0) 开始。在当前行中向…

GitLab CI/CD使用runner实现自动化部署前端Vue2 后端.Net 7 Zr.Admin项目

1、查看gitlab版本 建议安装的runner版本和gitlab保持一致 2、查找runner 执行 yum list gitlab-runner --showduplicates | sort -r 找到符合gitlab版本的runner&#xff0c;我这里选择 14.9.1版本 如果执行出现找不到下载源&#xff0c;添加官方仓库 执行 curl -L &quo…

机器学习基础-机器学习的常用学习方法

目录 半监督学习的概念 规则学习的概念 基本概念 机器学习里的规则 逻辑规则 规则集 充分性与必要性 冲突消解 命题逻辑 → 命题规则 序贯覆盖 单条规则学习 剪枝优化 强化学习的概念 1. 强化学习对应了四元组 2. 强化学习的目标 强化学习常用马尔可夫决策过程…

docker安装rabbit后访问报错最佳的几种解决方案

错误通常是由于RabbitMQ的安全配置导致的&#xff0c;RabbitMQ默认配置允许的用户仅能通过localhost访问。这通常出现在RabbitMQ的guest用户上&#xff0c;guest用户默认只能从localhost登录&#xff0c;而无法从其他IP地址进行远程访问。 解决方法&#xff1a; 1. **创建一个…

26个开源Agent开发框架调研总结(2)

根据Markets & Markets的预测&#xff0c;到2030年&#xff0c;AI Agent的市场规模将从2024年的50亿美元激增至470亿美元&#xff0c;年均复合增长率为44.8%。 Gartner预计到2028年&#xff0c;至少15%的日常工作决策将由AI Agent自主完成&#xff0c;AI Agent在企业应用中…

第 32 章 - Elasticsearch 的应用场景与技术解决方案

思维导图 0. 简介 Elasticsearch 主要应用于搜索场景。场景的如 应用内的搜索框、还有日志搜索等。 下面将介绍 Elasticsearch 在开发中的常见应用场景。 1. 日志搜索 日志搜索是最常见的应用。 其组合技术为&#xff1a;Kafka、Logstash、Elasticsearch、Kibana 该组合整体…

VsCode对Arduino的开发配置

ps&#xff1a;我的情况是在对esp32进行编译、烧录时&#xff0c;找不到按钮&#xff0c;无法识别Arduino文件&#xff0c;适合已经有ini文件的情况。 1.在vscode中安装拓展 2.打开设置&#xff0c;点击右上角&#xff0c;转到settings.json文件 3.复制以下代码并保存 {"…

python学opencv|读取图像(三十二)使用cv2.getPerspectiveTransform()函数制作透视图-变形的喵喵

【1】引言 前序已经对图像展开了平移、旋转缩放和倾斜拉伸技巧探索&#xff0c;相关链接为&#xff1a; python学opencv|读取图像&#xff08;二十八&#xff09;使用cv2.warpAffine&#xff08;&#xff09;函数平移图像-CSDN博客 python学opencv|读取图像&#xff08;二十…

AWS云计算概览(自用留存,整理中)

目录 一、云概念概览 &#xff08;1&#xff09;云计算简介 &#xff08;2&#xff09;云计算6大优势 &#xff08;3&#xff09;web服务 &#xff08;4&#xff09;AWS云采用框架&#xff08;AWS CAF&#xff09; 二、云经济学 & 账单 &#xff08;1&#xff09;定…

Unity TextMesh Pro入门

概述 TextMesh Pro是Unity提供的一组工具&#xff0c;用于创建2D和3D文本。与Unity的UI文本和Text Mesh系统相比&#xff0c;TextMesh Pro提供了更好的文本格式控制和布局管理功能。 本文介绍了TMP_Text组件和Tmp字体资产(如何创建字体资产和如何解决缺字问题),还有一些高级功…

数据结构与算法之链表: LeetCode 19. 删除链表的倒数第 N 个结点 (Ts版)

删除链表的倒数第 N 个结点 https://leetcode.cn/problems/remove-nth-node-from-end-of-list/ 描述 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5]示…

【STM32-学习笔记-2-】外部中断

文章目录 外部中断Ⅰ、EXIT函数Ⅱ、EXTI_InitTypeDef结构体参数①、EXTI_Line②、EXTI_LineCmd③、EXTI_Mode④、EXTI_Trigger Ⅲ、NVIC函数Ⅳ、NVIC_InitTypeDef结构体参数①、NVIC_IRQChannel②、NVIC_IRQChannelCmd③、NVIC_IRQChannelPreemptionPriority④、NVIC_IRQChanne…