没有获得cin.getline()的所需输出,

时间:2013-05-02 22:21:34

标签: c++ file-io time

我今天刚刚开始使用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(&current);

}

对于输出,第一行是黑色,第二行列出第一行应该是什么,它也缺少第一个字母,第三行与系统时间一致。

3 个答案:

答案 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
  1. 首先,cin>>outFileName将从cin中提取字符,直到找到空格。 foo之后的第一个空白字符是\n。此\n 提取,因此仍保留在输入流中。

  2. 然后cin.getline(event, 30, '\n');会尝试从cin中提取最多29个字符的行,并在达到\n时停止。正如我们刚刚看到的那样,\n之后的foo被留在了流中,所以它只会读取它,实际上它之前没有任何字符。然后提取并丢弃\nevent将为空字符串。

  3. 然后你cin.ignore();会忽略一个字符。 \n之后的流中的下一个字符是s开头的something。这样就会被提取并丢弃。

  4. 然后输出event,这是一个空字符串,所以你得到一个空行。

  5. 然后cin.getline(details, 256, '\n');最多会提取255个字符,直到它到达\n,在这种情况下会提取omething(请记住,我们已经忽略了s })然后提取并丢弃以下\n

  6. 然后cin.ignore()会忽略blah blah的第一个字符,即b

  7. 然后输出包含details的{​​{1}}。

  8. 然后你输出系统时间,正如你所说,它是好的,因为它不是来自输入流。

  9. 所以主要的问题是你在错误的地方使用omething。您在cin.ignore()之后使用它,但getline 提取并放弃该行末尾的getline。当您使用\ncin.ignore()中提取时,您需要使用>>的地方。 提取新行,它只是停在它上面。

    简单地摆脱目前的cin,并在cin.ignore()之后放置一个。

    但是,请考虑用户输入cin>>outFileName;作为文件名时的问题。将提取foo bar,但foo将保留在流中。如果你想忽略该行的其余部分,你需要这样做:

    bar\n