我今天刚刚开始使用c ++,我已经查看过很多有关此主题的供稿。在搜索时我发现了一个名为ignore的函数,它有点帮助。我最初的问题是在运行时跳过了输入。我发现这可能是因为\ n仍然在缓冲区中,因此我使用cin.ignore()函数将其刷新。但是,我仍然没有得到我想要的输出。这是我的代码:
{
time_t current;
char event[30];
char details[256];
char outFileName[21];
cout<< "Enter name of file to hold the input.[20 Character Max]: ";
cin>>outFileName;
ofstream outFile(outFileName);
cout<< "Event: ";
cin.getline(event, 30, '\n');
cin.ignore();
outFile<< event<< '\n';
cout<< "Details: ";
cin.getline(details, 256, '\n');
cin.ignore();
outFile<< details<< '\n';
current = time(NULL);
outFile<< ctime(¤t);
}
对于输出,第一行是黑色,第二行列出第一行应该是什么,它也缺少第一个字母,第三行与系统时间一致。
答案 0 :(得分:0)
在输入文件名后立即输入cin.ignore。来自cin>>outFileName;
的回车被下一个cin吸收。
另外我不确定忽略是否是在这里使用的正确命令。如果这不起作用,请尝试cin.clear()
或cin.sync()
。拿着这粒盐,因为我还在学习C ++。
答案 1 :(得分:0)
我很困惑。您是否尝试从文件中读取,然后写入文件??
编辑:我想我弄明白你要做什么。您可以忽略以下内容。您没有从文件中读取任何内容。 cin.getline从键盘获取输入。您想要的是实例化一个读取和写入文件的文件对象。
//Create a file that reads AND writes
std::fstream readAndWrite(outFile, std::ios::in | std::ios::out);
注意ostream,而不是流(即ifstream用于阅读,ofstream用于写入,fstream用于两者)
//Check to see if the file opened
if(readAndWrite.is_open())
{
cout<< "Event: ";
readAndWrite.getline(event, 30, '\n');
readAndWrite << event << '\n';
//Same for the rest of your code
//Close file
readAndWrite.close();
}
else
std::cout << "\nFile did not open! " << std::endl;
答案 2 :(得分:0)
让我们假设以下用户输入:
Enter name of file to hold the input.[20 Character Max]: foo
Event: something
Details: blah blah
首先,cin>>outFileName
将从cin
中提取字符,直到找到空格。 foo
之后的第一个空白字符是\n
。此\n
未提取,因此仍保留在输入流中。
然后cin.getline(event, 30, '\n');
会尝试从cin
中提取最多29个字符的行,并在达到\n
时停止。正如我们刚刚看到的那样,\n
之后的foo
被留在了流中,所以它只会读取它,实际上它之前没有任何字符。然后提取并丢弃\n
,event
将为空字符串。
然后你cin.ignore();
会忽略一个字符。 \n
之后的流中的下一个字符是s
开头的something
。这样就会被提取并丢弃。
然后输出event
,这是一个空字符串,所以你得到一个空行。
然后cin.getline(details, 256, '\n');
最多会提取255个字符,直到它到达\n
,在这种情况下会提取omething
(请记住,我们已经忽略了s
})然后提取并丢弃以下\n
。
然后cin.ignore()
会忽略blah blah
的第一个字符,即b
。
然后输出包含details
的{{1}}。
然后你输出系统时间,正如你所说,它是好的,因为它不是来自输入流。
所以主要的问题是你在错误的地方使用omething
。您在cin.ignore()
之后使用它,但getline
提取并放弃该行末尾的getline
。当您使用\n
从cin.ignore()
中提取时,您需要使用>>
的地方。 不提取新行,它只是停在它上面。
简单地摆脱目前的cin
,并在cin.ignore()
之后放置一个。
但是,请考虑用户输入cin>>outFileName;
作为文件名时的问题。将提取foo bar
,但foo
将保留在流中。如果你想忽略该行的其余部分,你需要这样做:
bar\n