如何在C ++中的while循环中存储先前的迭代?

时间:2012-09-17 23:17:13

标签: c++ loops while-loop

我看到有类似标题的内容已被回答,但内容对我来说过于密集,因为我不知道很多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);

         }

但这也不起作用,我的程序无法识别输入结束程序。整个计划的背景是否值得发布?

4 个答案:

答案 0 :(得分:4)

我真的不想回答你的具体问题,因为做你想做的事的惯用方式是相当不同的,而且相当简洁:

std::ofstream outfile("output.txt");

for (std::string line; std::getline(std::cin, line); )
{
    if (line.empty()) { break; }

    outfile << line << std::endl;
}

答案 1 :(得分:1)

这么多东西。

首先,为清楚起见,删除多余的括号。然后,使用a != b代替!(a == b)

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

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

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

std::cout << "\n";

......简单如π。

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

答案 2 :(得分:0)

如果在char表达式中使用,

int会被提升为+ s。你究竟想要比较什么?

  

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

然后这个 (!(new_advice == '\n' + '\n'))) && (!(temp == '\n'))会立即失败。

你的括号'不匹配。

答案 3 :(得分:0)

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

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

char previous = '\0';
while (cin) {

我认为你真的想找到一个结尾并添加一个&#39; \ n&#39;但是这在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答案可行,但不会告诉您有关您尝试做的所有事情。