【问题标题】:Not getting desired output for cin.getline(),cin.getline() 没有得到想要的输出,
【发布时间】:2013-05-02 22:21:33
【问题描述】:

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

}

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

【问题讨论】:

  • 如果您今天刚开始使用 C++,那么在 Stack Overflow 上发帖还为时过早。 SO上有数千个重复的问题,你应该花一到三个星期来阅读其他帖子...
  • 不是getline 换行,而是cin &gt;&gt;。不过,我强烈建议您开始使用std::string,并且我希望能够输入包含空格的文件名。

标签: c++ file-io time


【解决方案1】:

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

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

【讨论】:

  • 非常感谢您的帮助。我现在就试试。
【解决方案2】:

让我们想象以下用户输入:

Enter name of file to hold the input.[20 Character Max]:  foo
Event: something
Details: blah blah
  1. 首先,cin&gt;&gt;outFileName 将从cin 中提取字符,直到找到空格。 foo 之后的第一个空格字符是 \n。这个\n没有被提取,所以仍然留在输入流中。

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

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

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

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

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

  7. 然后输出包含omethingdetails

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

所以主要问题是您在错误的地方使用了cin.ignore()。您在getline 之后使用它,但getline 确实 提取并丢弃了行尾的\n。您需要使用cin.ignore() 的地方是当您使用&gt;&gt;cin 中提取时。这提取新行,它只是停在它上面。

只需删除您目前拥有的cin.ignore()s,并在cin&gt;&gt;outFileName; 之后放置一个。

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

cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

【讨论】:

    【解决方案3】:

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

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

    您没有从文件中读取任何内容。 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-05
      • 1970-01-01
      相关资源
      最近更新 更多