windows下C语言非阻塞方式读取键盘缓冲区

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了windows下C语言非阻塞方式读取键盘缓冲区相关的知识,希望对你有一定的参考价值。

请给出有用的答案,增加悬赏。垃圾答案请别浪费大家的时间。linux下我知道怎么搞。请确定是在windows下用C语言!
已经解决了采用_kbhit()函数
#include <conio.h>

参考技术A 有所不同。服务器是网络的节点,存储、处理网络上80%的数据、信息,在网络中起到举足轻重的作用。它们是为客户端计算机提供各种服务的高性能的计算机,其高性能主要表高速度的运算能力、长时间的可靠运行、强大的外部数据吞吐能力等方面。服务器的构成与普通电脑类似, 参考技术B getch() 以不回显的方式键入字符. 参考技术C //按下y键退出
#include<stdio.h>
#include<conio.h>
int main()

while(1)

if(_kbhit() &&'y'==_getch())

break;




仅供参考
参考技术D 1、“打开”文件的含义:以某中方式从磁盘上查找指定的文件或创建一个新文件。
2、size_t fread(void *buffer, size_t size, size_t count, FILE *fp):从文件fp中读入count次
,每次读size字节,读入的信息存在buffer指针指向的缓冲区。函数返回值等于实际读入的次数(可能少于
count)。
size_t fwrite(void *buffer, size_t size, size_t count, FILE *fp):将buffer地址开始
的信息,写入count次,每次写size字节至文件fp中。函数返回值等于实际写入的次数(可能少于count)。
3、
int fputc(int c, FILE *fp)----把字符c写入文件fp,成功时返回字符c的ASCII码,失败时返回
EOF(在stdio.h中,符号常量EOF的值等于-1)。
----从文件fp中读一个字符,返回读得的字符。
对于文本文件,遇文件尾时返回EOF。
对于二进制文件,用feof(fp) 判别是否遇文件尾。feof(fp)=1说明遇文件尾。
4、fscanf函数和fprintf函数
(1)、fscanf函数fscanf函数只能从文本文件中按格式输入。fscanf函数和scanf函数相似,只是输入的对象是磁盘上文本文件中的数据。函数的调用形式如下:例如,若文件指针fp已指向一个已打开的文本文件,a、b分别为整型变量,则以下语句从fp所指的文件中读入两个整数放入变量a和b中:fscanf(fp, "%d%d",&a,&b);注意:文件中的两个整数之间用空格(或跳格符、回车符)隔开。语句:fscanf(stdin,"%d%d",&a,&b);等价于:scanf("%d%d",&a,&b);因为文件名stdin就是代表终端键盘。
(2)、fprintf函数fprintf函数按格式,并以ASCⅡ代码形式输出到文本文件中。fprintf函数和printf函数相似,只是输出的内容将按格式存放在磁盘的文本文件中。函数的调用形式如下:fprintf(文件指针,格式控制字符串,输出项表)例如,若文件指针fp已指向一个已打开的文本文件,x,y分别为整型变量,则以下语句将把x和y两个整型变量中的整数按%d格式输出到fp所指的文件中:fprintf(fp,“%d %d”,x,y);注意:为了以后便于读入,两个数之间应当用空格隔开。同时也是为了便于读入,最好不要输出附加的其他字符串。以下语句:fprintf(stdout,“%d %d”,x,y);等价于:printf(”%d %d”,x,y);因为文件名stdout就是代表终端屏幕。
5、其他读写函数
int putw(int w, FILE *fp)
int getw(FILE *fp)
char * fgets(char *str, int n, FILE *fp)
int fputs(const char *str, FILE *fp)
第5个回答  2014-10-12 键盘缓冲是啥?追问

哥们,不知道别来卖萌啊

追答

好吧,我只会最浅层的一些编程知识,C语言啥也不懂……

阻塞与非阻塞 I/O 缓冲?

【中文标题】阻塞与非阻塞 I/O 缓冲?【英文标题】:Blocked vs unblocked I/O buffering? 【发布时间】:2019-07-18 06:01:17 【问题描述】:

我正在阅读一些关于 z/OS 的 blocked IO 概念的信息。它指出:

阻塞 I/O 是对 ISO 标准的扩展。对于以块格式打开的文件,z/OS® XL C/C++ 一次读取和写入一个块。如果您尝试向块中写入的数据多于该块可以容纳的数据,则数据将被截断。对于阻塞的 I/O,z/OS XL C/C++ 只允许使用 fread() 和 fwrite() 来读取和写入文件。

然后说:

fflush() 函数对阻塞的 I/O 文件无效。

但是,在another 文章中,它说:

对于终端,因为 I/O 总是畅通的,所以行缓冲是 相当于完全缓冲。

对于记录 I/O 文件,缓冲是 仅对 z/OS UNIX 中的阻塞文件或记录 I/O 文件有意义 使用完全缓冲的文件系统。对于未阻塞的文件,缓冲区是 每次写入后已满,因此立即写入,离开 没有什么可冲洗的。对于被阻止的文件或完全缓冲的 UNIX 文件系统 文件,但是,缓冲区可以包含一个或多个记录 没有被刷新并且需要刷新操作才能进入 系统。

对于阻塞的 I/O 文件,缓冲总是没有意义的。

我对这一切感到非常困惑。如果 I/O 是畅通的,那么行缓冲如何等同于全缓冲?为什么刷新不会对块 I/O 产生影响?另外,阻塞的 I/O 导致缓冲总是没有意义是什么意思?任何关于阻塞和非阻塞 I/O 发生了什么以及它如何影响缓冲效果的直觉都将不胜感激。

【问题讨论】:

【参考方案1】:

我对您提供的内容的看法是,这是指 MVS 数据集的阻塞 I/O。这些将不同于存储在 Unix 系统服务 HFS / ZFS 中的文件。并且不同于终端 I/O。

我对这一切感到非常困惑。如果 I/O 未阻塞,将如何 行缓冲等价于全缓冲?

我认为您指的是对终端 I/O 的引用,它表明一行是一条记录并且与块大小相同,因此每条记录都是一个完整的数据块。也就是说,每个块有一条 LRECL = BLKSIZE == 1 条记录,因此它没有被缓冲,或者,缓冲区就是记录。

为什么刷新不会对块 I/O 产生影响?

如果每个块有多个记录,则 fflush 不会写入块,直到块已满。我怀疑这与平台上比 C 更早的 z/OS 中的 I/O 实现有关,因此他们做出了设计决定,在 I/O 的执行方式上不会导致不同语言的不同行为。

另外,阻塞的 I/O 导致缓冲总是没有意义是什么意思?

同样,z/OS 会写入完整的块,但文件中的最后一个块可能很短,因为它没有包含完整块的足够记录。

在 C 进入平台之前,z/OS 有很多历史,z/OS 竭尽全力提供一致性。

【讨论】:

以上是关于windows下C语言非阻塞方式读取键盘缓冲区的主要内容,如果未能解决你的问题,请参考以下文章

C 非阻塞键盘输入

阻塞与非阻塞 I/O 缓冲?

在 C 中获取 Windows 串行端口的输入缓冲区长度

实现有界缓冲区(读取器和写入器之间的非阻塞,读取器之间的阻塞,写入器之间的阻塞)

linux网络编程中阻塞和非阻塞socket的区别

linux网络编程中阻塞和非阻塞socket的区别