C语言-输入/输出模型

        在C语言中,输入/输出(I/O)模型是程序与外部环境(如文件、终端等)进行数据交换的重要机制。本文将详细介绍C语言中的输入/输出模型,包括其基本概念、不同的I/O函数、缓冲区的概念以及示例代码和注释。

        这些年,我们的硬件设备:CPU ,内存, I / O 设备都在不断迭代,不断朝着更快的方向努力。但是,在快速发展的过程中,有一个核心矛盾一直存在,那就是这三者之间 的速度差异 。我们可以形象地描述为: CPU 一天,内存一年;内存一天, IO 设备十年。( 假设 CPU 执行一条普通指令需要一天,那么 CPU 读取内存就需要一年;假设内存之间传递单位数据需要一天,那么内存与 IO 设备之间传递单位数据就需要十年 ) 。为了平衡这三者之间的鸿沟,一个有效的手段是引入缓冲 ,如下图所示:
        为了平衡内存和 IO 设备之间的速度差异,我们会在 内存 中设置一些缓冲区 ( buffer ) ,其中就有标准输入缓冲区 ( stdin ) 和标准输出缓冲区 ( stdout ). 一般情况下, stdin 关联到键盘,而 stdout 关联到屏幕。 scanf 的作用是,从 stdin 读取数据到程序;而printf 的作用是,将输出结果写入到 stdout

基本概念

C语言的I/O操作主要涉及以下几个核心概念:

  1. 文件描述符

    • 文件描述符是一个用于标识文件或其他I/O资源的整数值。在UNIX和类UNIX系统中,通常0表示标准输入(stdin)、1表示标准输出(stdout)、2表示标准错误输出(stderr),其他文件描述符用于表示打开的文件或设备。
  2. 缓冲区

    • 缓冲区是内存中的一个区域,用于临时存储I/O数据。C语言中的标准I/O库提供了缓冲机制,可以显著提高I/O效率。
  3. 阻塞和非阻塞I/O

    • 阻塞I/O指的是当程序发起I/O操作时,如果无法立即完成,程序将阻塞(挂起)直到操作完成为止。非阻塞I/O允许程序继续执行其他任务而不必等待I/O操作完成。

标准I/O函数

C语言中的标准I/O函数包括在 <stdio.h> 头文件中,常见的函数有:

  • printf:向标准输出打印格式化数据。
  • scanf:从标准输入读取格式化数据。
  • fprintffscanf:类似于 printfscanf,但操作指定文件。
  • fopenfclose:打开和关闭文件。
  • freadfwrite:从文件读取数据和向文件写入数据。
  • fgetsfputs:从文件读取字符串和向文件写入字符串。
  • fseekftell:在文件中定位和获取当前文件位置。
#include <stdio.h>

int main() {
    FILE *fp;
    char buffer[100];
    int num;

    // 打开文件以写入数据
    fp = fopen("file.txt", "w");
    if (fp == NULL) {
        perror("Error opening file");
        return 1;
    }

    // 写入字符串到文件
    fprintf(fp, "This is a test file.\n");
    fputs("Hello, World!\n", fp);

    // 关闭文件
    fclose(fp);

    // 打开文件以读取数据
    fp = fopen("file.txt", "r");
    if (fp == NULL) {
        perror("Error opening file");
        return 1;
    }

    // 从文件读取数据并输出到标准输出
    while (fgets(buffer, sizeof(buffer), fp) != NULL) {
        printf("%s", buffer);
    }

    // 关闭文件
    fclose(fp);

    return 0;
}

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值