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

C语言( 缓冲区和重定向)

一.缓冲输入,无缓存输入

    while((ch=getchar()) != '#')

        putchar(ch);

这里getchar(),putchar()每次只处理一个字符(这里只是知道就好了),而我们使用while循环,当读到#字符时停止

而看到输出例子,第一行我们输入hello word然后按下回车键,把缓冲区里的字符输入到程序中(这种属于缓冲输入)

而还有另一种还有输入叫无缓存输入(因为我的电脑只支持缓存输入,所以这里用刚才输入的例子给你简单的解释下)

这里我们输入在输入hello word会出现这种情况

Hheelllloo  wwoorrdd

这里的红色部分就是计算机输出部分,我们输入一个字符计算机就输出一个部分,不会进行缓存

这种无缓存输入一般我们在玩游戏就是这样,我们输入一个键就执行相应的指令

 

为什么要有缓存区呢,首先,把若干个字符作为一个块进行传输比逐个发送这些字符节约时间。其次,比如用户打错字符,可以直接通过键盘修正错位。当最后按下Enter键时,传输的是正确的输入。

那么,使用缓存输入还是无缓存输入,ANSI C和后续的C标准都规定输入时缓冲的

二.完全缓存和行缓存

完全缓存输入指的是当缓存区被填满时才刷新缓存区(内容被发送至目的地),通常出现在文件输入中。缓冲区的大小取决于系统,常见的大小是512字节和1096字节

行缓存指的时在换行符时刷新缓存区。键盘输入通常时行缓存输入,所以在按下Enter键后才刷新缓存区

三.实例讲解

这里我们做一个猜数字游戏游戏,计算器猜,猜对了久输入y,猜错了久输入n

 

这里我们让计算机猜数字,这里注意我们每次输入n时,程序会打印两条信息。这是由于程序读取n作为用户否定了数字1,然后还读取了一个换行符作为用户否定了数字2.

所以我们必须进行优化程序

while(getchar() != '\n')

        continue;

这里我们用 while循环丢弃输入行最后剩余的内容,包括换行符。但是这个方法还是有个不好的地方就是我们输入n 或f都会被自动判断为n

源码:


#include <stdio.h>int main(){int guess = 1;char response;printf("Pick an integer from 1 to 100.I will try to guess.");printf("it.\nRespond with a y if my guess is right and with");printf("\nan n if it is wrong.\n");printf("uh...is your number %d?\n",guess);  //计算机猜数字while((response = getchar()) != 'y'){if(response == 'n') printf("Well,then,is it %d?\n",++guess);    //如果输入n则继续猜else printf("Sorry,I understand only y or n.\n");               //非n则告诉你输入错误重新输入while(getchar() != '\n') continue;         //处理掉其他多余字符}printf("I knew I could do it!\n");return 0;}

 

五.重定向

在默认情况下,C程序使用标准的I/O包查找标准输入作为输入源(stdin流)。而程序除了能从键盘输入数据外。还有两种方式

第一种:重定向文件。将文件内容输入到程序中和程序数据输出到文件中。

第二种:使用特定的函数打开文件,会文件进行一系列特定的操作。

在一章节我们主要讲解重定向操作,文件函数操作我们会在后面的章节在进行讲解。

1.重定向输入

比如我们有程序print.c。内容如下

它的功能就算打印输入的数据内容

这里我们在创建一个文本文件.名为data.txt

里面包含文本hello world

这里我将它们放置在同一个文件,这里注意是和可执行文件在一个文件夹当中

而可执行文件(vs 版本的)

红色下划线部分就算项目的存储地址。后面到Debug存放着项目可执行文件。

最后我们使用

.\Project1.exe < data.txt

.\Project1.exe就算执行可执行文件的格式 .\ + 可执行文件名

< 重定向输入符号

Data.txt就算输入文件

最后我们看到结果的确也可以正常打印出来。

2.输出重定向

这里和输入重定向一样。用 > 符号。但这里要记住用 > 会覆盖掉指定输出文件的内容。如果不想覆盖掉可以使用 >> 追加符号。下面我们来演示一下。如果指定的文件未创建,系统将会自动创建

在使用中>后。原本data.txt里面的内容被覆盖了

使用>>会发现原有的内容还在。

这里需要知道重定向是不允许多个文件同时重定向输入和输出的

这里我们在看一个例子。这里我们先看红色下划线部分。Data.txt负责重定向输入。而程序的打印结果重定向到print.txt当中。

而通过dir /b(列出当前目录中所以文件)可以看到之前print.txt文件是没有的。是在执行完重定向之后被自动创建的。而文件的内容和data.txt一样。



好了朋友们我们今天的内容到这就结束了,今天的内容到这里就结束了,如果有啥不会的朋友记得论坛里面提问哈~

如果朋友你感觉文章的内容对你有帮助,可以点赞关注文章和专栏以及关注我哈,嘿嘿嘿我会定期更新文章的,谢谢朋友你的支持哈

http://www.lryc.cn/news/7157.html

相关文章:

  • 编程思想、方法论和架构的类型及应用
  • 【OA办公】OA流程审批大揭秘,带你看遍所有基础流程
  • 《零基础入门数据结构与算法》专栏介绍
  • 测试开发之Django实战示例 第九章 扩展商店功能
  • 【Spring】一文带你吃透AOP面向切面编程技术(下篇)
  • 【java】Spring Boot --40 个 Spring Boot 常用注解(建议收藏)
  • 《游戏学习》| 微信对话模拟生成器源码分析
  • 剑指 Offer 10- I. 斐波那契数列[c语言]
  • 【C#基础】C# 数据类型总结
  • 再创荣誉 | Softing工业荣获CAIMRS 2023 数字化创新奖
  • Multi Paxos
  • Android - dimen适配
  • 深度学习网络模型——RepVGG网络详解
  • 仓库拣货标签应用案例
  • 介绍一款HCIA、HCIP、HCIE的刷题软件
  • 线程池整理汇总
  • 华为OD机试真题Python实现【最短木板长度】真题+解题思路+代码(20222023)
  • VMware安装CentOS7
  • 力扣24.两两交换链表中的节点
  • AtCoder Regular Contest 137 题解(A~C)
  • 【C语言】预处理指令
  • Java基础之多线程JUC全面学习笔记
  • 13.CSS文本样式
  • 西恩科技更新招股书:IPO前大手笔分红“套现”, 赵志安为实控人
  • 【CentOS】有关时间的设置
  • OpenCV制作Mask图像掩码
  • C++STL剖析(九)—— unordered_map和unordered_multimap的概念和使用
  • Android无菜单键,如何触发onCreateOptionsMenu(Menu menu)
  • “黑洞”竟是外星人的量子计算机?
  • 计算机网络入门