-1

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

}

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

4

3 回答 3

0

在输入文件名后放置一个 cin.ignore 。来自的回车cin>>outFileName;被下一个 cin 吸收。

另外我不确定忽略是否是在这里使用的正确命令。如果这不起作用,请尝试cin.clear()cin.sync(). 因为我还在学习 C++,所以对此持保留态度。

于 2013-05-02T22:31:22.870 回答
0

我很困扰。您是否尝试从文件中读取,然后写入文件?

编辑:我想我知道你想要做什么。您可以忽略以下内容。

您没有从文件中读取任何内容。cin.getline 从键盘获取输入。您想要的是实例化一个读取和写入文件的文件对象。

//Create a file that reads AND writes
std::fstream readAndWrite(outFile, std::ios::in | std::ios::out);

注意 ostream,而不是 ofstream(即 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;
于 2013-05-02T22:36:50.330 回答
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. 正如我们刚刚看到的,尽管\nafterfoo被留在了流中,所以它只会读到那个,它之前实际上没有字符。然后\n被提取并丢弃,event将是一个空字符串。

  3. 然后你cin.ignore();会忽略一个字符。之后流中的下一个字符\ns的开头something。所以它被提取并丢弃。

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

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

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

  7. 然后你输出details包含omething.

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

所以主要问题是你cin.ignore()在错误的地方使用。您在 之后使用它getline,但getline \n在行尾提取并丢弃。您需要使用的地方cin.ignore()是当您使用>>cin. 这不会提取新行,它只是停在它上面。

只需摆脱cin.ignore()您目前拥有的 s,然后将其放在 s 之后cin>>outFileName;

但是,请考虑用户foo bar作为文件名输入时的问题。将foo被提取,但bar\n将留在流中。如果要忽略该行的其余部分,则需要执行以下操作:

cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
于 2013-05-02T22:37:16.503 回答