2

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

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

我的代码看起来像这样,但我知道temp并且new_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);

         }

但这也不起作用,我的程序无法将 enter 识别为结束程序。整个程序的上下文是否值得发布?

4

4 回答 4

4

I don't really want to answer your specific question, since the idiomatic way of doing what you want is rather different, and quite a bit cleaner:

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

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

    outfile << line << std::endl;
}
于 2012-09-17T23:28:59.197 回答
1

这么多的事情。

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

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

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

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

std::cout << "\n";

……像 π 一样简单。

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

于 2012-09-17T23:27:28.167 回答
0

charint如果在+表达式中使用, s 将被提升为s。你到底想比较什么?

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

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

而且你的括号'不匹配。

于 2012-09-17T23:27:09.210 回答
0

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

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

char previous = '\0';
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答案会奏效,但不会教给您您尝试做的所有事情。

于 2012-09-17T23:28:51.147 回答