如何在C++中的while循环中存储上一次迭代

How do I store a previous iteration in a while loop in C++?

本文关键字:存储 上一次 迭代 循环 while C++ 中的      更新时间:2023-10-16

我看到一个类似标题的东西已经得到了回答,但内容对我来说太密集了,因为我对c++不太了解。

我对编程很陌生,我不知道如何将上一次迭代存储在while循环中。我正在尝试使用while循环将用户文本写入文件,并以两个n字符结束他们的输入。这就是我的问题所在,因为对于我当前的代码,输入以一个enter实例结束。

我的代码看起来是这样的,但我知道tempnew_advice是相同的:

char new_advice, temp;
while( (!(new_advice == 'n' + 'n'))) && (!(temp == 'n')) )
{
temp = new_advice;
cin.get(new_advice);
fout.put(new_advice);
}

编辑*好吧,我想我不清楚我在问什么。

最初的任务是:"允许用户输入建议,使其可以是任意行长。用户被告知通过按两次回车键来结束他或她的建议。然后,您的程序可以通过检查何时读取到连续两次出现的字符"\n"来测试是否已到达输入的末尾。">

这会改变我问题的答案吗?

我现在已经尝试用代码做到这一点:

char new_advice;
int temp = 0;
while(temp < 2)
{
if(new_advice == 'n')
{
temp = temp++;
}
cin.get(new_advice);
fout.put(new_advice);
}

但这也不起作用,我的程序不识别进入程序结束。整个节目的背景值得发布吗?

我真的不想回答你的具体问题,因为做你想做的事情的惯用方式非常不同,而且更干净:

std::ofstream outfile("output.txt");
for (std::string line; std::getline(std::cin, line); )
{
if (line.empty()) { break; }
outfile << line << std::endl;
}

这么多东西。

首先,为了清晰起见,去掉多余的括号。然后,使用a != b而不是!(a == b)

这产生了while(new_advice != 'n' + 'n') && temp != 'n'),我不确定它应该做什么(甚至忽略会导致编译错误的不匹配括号):'n' + 'n'添加了两个字符,这是一个整数加法。但是,即使它不是,而是字符串串联,您也会随后将结果(两个字符的字符串)与单个字符进行比较。这永远不会产生true

现在,关于逻辑:只需用回车分隔每一行,并在末尾添加一个额外的回车字符:

std::string line;
while (std::getline(std::cin, line))
std::cout << line << "n";
std::cout << "n";

…就像π一样简单。

但除此之外,以两条换行符结束输入是不寻常的。相反,按照惯例(在UNIX中),每一行最后都由一条换行符分隔。

如果在+表达式中使用,则

chars将提升为ints。你到底想比较什么?

我的代码看起来是这样的,但我知道temp和new_avice是一样的:

则此
(!(new_advice == 'n' + 'n'))) && (!(temp == 'n'))将立即失败。

你的括号不匹配。

简化您的循环,以便在您有输入时进行检查:while(cin) {

如果您需要存储以前的值,请将该变量仅保留在循环之外:

char previous = '';
while (cin) {

我认为您确实想找到一个行的末尾并添加一个'\n',但这在windows和unix之间是不可移植的。std::getline答案的效果要好得多。但是,假设你想自己做这件事。。。

在循环中声明并为当前角色指定一个值。

char current;
cin >> current;

然后通过再次检查cin来再次检查您实际收到的有效输入。

if(!cin) {
break;
}

接下来,用这个角色做任何你需要的事情:

fout << current;
if(`n` == current) {
fout << 'n'; // though std::endl would be more portable
}

最后,更新您以前的变量。

previous = current;
}

我试着通过修复这个问题来理解所涉及的多个概念,尽管我认为你不需要这些。std::getline答案会起作用,但不会教会你所有尝试做的事情。