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

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

标准 I/O

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

标准 I/O 的通道:

  1. 标准输入 (stdin):默认从键盘获取输入。
  2. 标准输出 (stdout):默认向终端显示输出。
  3. 标准错误 (stderr):输出错误信息,默认也显示在终端。
c 复制代码
#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 是指通过文件操作函数对磁盘上的文件进行读写操作这通常用于持久化存储数据,例如读取配置文件、保存程序运行结果等。

c 复制代码
#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 数据、图片、视频等,将它们转化为二进制数据进行传输。
  • 配置文件:从文件中读取程序的配置参数,或将配置写回文件。
  • 文件编辑工具:文本编辑器或文件转换工具。
c 复制代码
#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

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

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

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

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

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

相关推荐
易保山5 分钟前
MIT6.S081 - Lab6 Copy-on-Write(写时复制)
linux·操作系统·c
m0_5557629022 分钟前
struct 中在c++ 和c中用法区别
java·c语言·c++
獨枭25 分钟前
Linux 下安装和使用 Jupyter Notebook
linux·chrome·jupyter
Monee..35 分钟前
linux里安装pip和conda
linux·conda·pip
ZaaaaacK1 小时前
STM32技能综合巩固
stm32·单片机·嵌入式硬件
南玖yy1 小时前
数据结构C语言练习(两个队列实现栈)
c语言·数据结构·算法
阳区欠1 小时前
【Linux】进程通信
linux·运维·服务器·共享内存·进程通信·system v·管道文件
yuanbenshidiaos2 小时前
stm32面试
stm32·嵌入式硬件·面试
charlie1145141912 小时前
STM32F103C8T6单片机的起始点:使用GPIO输出点亮我们的第一个小灯(标准库篇)
stm32·单片机·嵌入式硬件
姓刘的哦2 小时前
Ubuntu环境安装
linux·运维·ubuntu