我看到有类似标题的内容已被回答,但内容对我来说过于密集,因为我不知道很多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);
}
但这也不起作用,我的程序无法识别输入结束程序。整个计划的背景是否值得发布?
答案 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
答案可行,但不会告诉您有关您尝试做的所有事情。