繁体   English   中英

C ++ Primer 1.4.4 — EOF的重要性以及如何编写没有EOF才能结束的代码?

[英]C++ Primer 1.4.4 — Importance of EOF and how to write in a code that will end without EOF?

提到两个问题:

  1. C ++ Primer 1.4.4的输出不正确
  2. 在C ++ Primer示例中被控制流执行所迷惑

这两个帖子都回答了我的问题,但我想进一步研究。

首先,我知道这仅仅是个开始,但是假设我编写了一个在设计好的窗口中运行的功能齐全的程序。 到那个水平,我是否已经知道如何实施EOF? 我不能期望运行我的程序的人知道他们需要按Control-Z

有没有一种方法可以实现可运行的特定代码,从而不需要我输入无法识别的值?

在这些问题中,还有一个人在某种程度上回答了EOF的重要性,但是该程序怎么甚至都没有发布最终的cnt - 1

假设我将数字设为10 10 10 20 2020。如果没有EOF,则只会显示“ 10次重复3次”。 程序为什么至少不输入计数“ 10次重复3次,而20次重复2次”减去最后一个空格。

可以说我制作了一个在设计窗口中运行的功能齐全的程序。 到那个水平,我是否已经知道如何实施eof? 我不能指望有人在运行我的程序时知道他们需要按ctrl + z。

您可以明确地告诉用户对结束输入执行特定操作,或者窗口本身的设计可以隐式地告知用户信息。 例如,一个对话框可能要求用户输入输入,完成后单击“确定”按钮。

有没有一种方法可以实现可运行的特定代码,从而不需要我输入无法识别的值?

似乎您宁愿使用换行符来终止输入。 这种用法的一个示例可以是std::getline 而不是写作

while (std::cin >> val)

你可以改用

std::string line;
if (std::getline(std::cin,line))

并假设您的用户输入仅包含一行值。 有许多其他方法可以类似地完成此任务,具体取决于您希望如何限制用户的输入。

假设我将数字设为10 10 10 20 2020。除此之外,这只会显示“ 10次重复3次”。 程序为什么至少不输入计数“ 10次重复3次,而20次重复2次”减去最后一个空格。

如果没有eof,您的程序仍将执行while (std::cin >> val)循环,因为std::cin >> val尚未收到无效的输入。

由于std::cout << currVal << " occurs " << cnt << " times" << std::endl; while循环完成执行之后发生,您(尚未)在输入中看不到有关三个20的任何信息。

当您阅读输入序列时,按下时需要一些提示。 这可能是前哨值(“输入999以停止读取”;您需要在读取时检测到该值),无效的输入(“输入X以停止读取”;当读取int ,值X非法并导致流进入故障模式,即设置了std::ios_base::failbit ),或更传统的“没有更多要读取的内容”。 对于文件,最后的条件很简单。 从控制台读取数据时,您要么需要教人们如何终止输入,要么需要使用其他方法。

如果您想拦截任何按键并直接对其进行反应,也可以这样做。 例如,您可以使用ncurses并通过它控制输入。 您还可以将conconle设置为非缓冲(在POSIX系统上,使用tcgetattr()tcsetattr()清除ICANON标志)并直接处理所有按键,以决定是否要继续阅读。

尽管我当然愿意做花哨的I / O东西,但我通常不会打扰:用户将理解“输入结束”字符并进行处理。 也就是说,我的输入通常看起来像这样:

while (in >> whatever_needs_to_be_read) { ... }

...,或者,如果输入确实是面向行的

for (std::string line; std::getline(in, line); ) { ... }

然后,将使用合适的std::istream可能std::cin来调用执行此输入的函数,尽管我通常也可以通过某种方式从文件中读取(除了shell专有的输入重定向外)。

顺便说一句,尽管提到的问题中有一些指示,但“ EOF”不是正在读取的字符。 不过,这是输入的字符(通常)。 ...并且“知道”输入字符的结尾是很常规的(在POSIX系统上为ctrl-D,在Windows上为ctrl-Z)。 您可以使用其他指示器,例如“中断”(ctrl-C),但这需要更多的工作并且不能与流很好地集成。 要使用中断处理程序,您需要为SIGINT设置信号处理程序并进行处理。 这样做的一个令人讨厌的部分是,如果弄错了,您将需要找到另一种方法来终止程序(例如,在使用ctrl-Z的POSIX上,使进程进入休眠状态并通过更严格的信号使其终止)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM