我使用getchar()
和puchar()
和'\n'
和EOF(在Visual Studio中)测试了很多情况,以更好地了解缓冲和getchar
的工作原理。
如果我的代码
int c;
printf("Enter character\n");
/* 1 - number for explaining steps */
c = getchar();
putchar(c);
/* 2 */
c = getchar();
putchar(c);
printf("hi");
在此代码中,如果我输入字符 a
并按 Enter 键,它将显示
a
hi
这意味着当我按下时'\n'
也会保存在缓冲区中,然后缓冲区中的第一项(a
)转到第一个c=getchar()
并打印a
;然后缓冲区中的第二项(\n
)转到第二个c=getchar()
并打印新行。
我得出结论,'\n'
保存在缓冲区中,这不是命令在按回车键时能够转到新行的结果,因为我为此测试了另一个代码:
while ((c = getchar()) != '\n')
putchar(c);
printf("hi");
在这段代码中,当我键入< code>a并按enter键时,它会打印< code>ahi,而新行不会打印,这意味着当< code>a传递给< code>getchar()时,< code>putchar()会打印它,然后当< code>getchar()获取< code>'\n'时,循环终止,循环内的< code>putchar()不会打印新行,因此该命令不会
现在我想测试另一个代码:
int c;
while ((c = getchar()) != EOF)
putchar(c);
printf("hi");
return 0;
在这个中,如果我传递它abc
和EOF的信号(在我的系统中^Z(Ctrl Z)),它将显示abc-
但是,相反,它打印
-
第一个示例中输入如何首先读取<code>a</code>,然后读取换行符的概述基本正确。就getchar()
而言,换行符是一个完全正常的字符;事实上,没有异常字符getchar()
可以返回任何符合char
的8位值,外加一个额外的值,称为EOF。这就是为什么它的返回值必须存储在<code>int</code>中的原因。
当底层read()
系统调用返回0个可读取字节时,或者当出现错误时,标准I/O函数返回EOF。
当您在Windows上键入abc
Control-Z时(您将在Unix上键入Control-D),然后:
abc
) 中的当前字符可用于 read()
系统调用。read()
系统调用使用这些字符填充标准 I/O 缓冲区。getchar()
调用返回 a
、b
和 c
。getchar()
等待更多输入。这不是EOF;它只是将线路上的字符冲洗到程序中。要获得 EOF 的效果,您必须在 abc
之后连续键入 Control-Z 两次。第一个会冲洗 abc
;第二个将生成 0 字节的 read(),
指示 EOF。
当按下换行符(Enter)时,终端驱动程序也会提供输入。如果在键入Enter后立即键入Control-Z,则所有零个待输入字符将从终端发送到程序,因此read()
返回0,因此标准I/O包报告EOF。
请注意,在按回车键或EOF指示之前,您可以使用退格键和其他编辑选项编辑行中的数据,包括删除所有数据。一旦你点击回车或EOF指示,你就不能再编辑可供read()
使用的数据。
类似的行为发生在Unix上;键入两次EOF指示以终止输入中线;一次以在行的开始处终止输入。
关于堆栈溢出有许多相关问题,包括以下问题:
同时((c=getc(file)) ! = EOF)
循环不会停止执行而(getchar() ! = EOF)
循环read()
from stdin不会忽略换行符本文向大家介绍emacs 文件和缓冲区,包括了emacs 文件和缓冲区的使用技巧和注意事项,需要的朋友参考一下 示例 在Emacs中,文件的含义与操作系统中的含义相同,并且用于永久存储数据。甲缓冲器是正在编辑的文件的内部表示。可以使用将文件读取到缓冲区中C-x C-f,并且可以使用C-x C-s(将文件保存到当前位置)或C-x C-w(将文件写入其他位置,提示输入-等效于Save as)将缓冲区写
两者都是序列化库,由谷歌开发人员开发。他们之间有什么大的区别吗?将使用协议缓冲区的代码转换为使用FlatBuffers需要大量工作吗?
在DirectX中,您可以有单独的渲染目标和深度缓冲区,因此可以绑定渲染目标和一个深度缓冲区、执行一些渲染、移除深度缓冲区然后使用旧的深度缓冲区作为纹理进行更多渲染。 你会如何在opengl中做到这一点?根据我的理解,您有一个帧缓冲区对象,其中包含颜色缓冲区和可选的深度缓冲区。我不认为我可以同时绑定多个帧缓冲器对象,我是否必须在每次更改时(可能一帧几次)重新创建帧缓冲器对象?普通的 opengl
问题内容: 我正在使用gSoap将旧式C 系统重构为SOA。我们遇到了一些性能问题(非常大的XML),因此我的领导要我看一下协议缓冲区。我做到了,它看起来非常酷(我们需要C 和Java支持)。但是协议缓冲区是仅用于序列化的解决方案,现在我需要将其发送到Java前端。从C ++和Java角度来看,我应该使用什么来通过HTTP(只是内部网络)发送那些序列化的内容? PS。另一个人试图加速我们的gSoa
多窗格 表 25.9. Emacs 窗格 C-x 2 M-x split-window-vertically 分隔出两个垂直窗格,水平分隔线 C-x 3 M-x split-window-horizontally 分隔出两个水平窗格,垂直分隔线 C-x 1 M-x delete-other-window 只保留当前窗格 ESC ESC ESC M-x keyboard-escape-quit 只保
请注意:虽然这个问题特别提到了Dropwizard,但我相信任何有泽西/JAX-RS经验的人都应该能够回答这个问题,因为我可以想象Dropwizard只是在幕后遵循泽西/JAX-RS约定。 我有一个Dropwizard服务,它用JSON编写,工作非常出色。 现在我想将其切换为读/写二进制数据(以最小化网络带宽)。我看到了Dropwizard Protobuf库,但我对在Dropwizard中实现二