没有得到想要的输出

Not getting desired output for cin.getline(),

本文关键字:输出      更新时间:2023-10-16

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

}

对于输出,第一行是黑色的,第二行列出了应该在第一行的内容,它也缺少了第一个字母,第三行是系统时间。

放一个空格。在输入文件名之后忽略。从cin>>outFileName;返回的回车被下一个cin吸收。

我也不确定是否忽略是正确的命令在这里使用。如果这不起作用,试试cin.clear()cin.sync()。我还在学习c++。

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

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时停止。正如我们刚才看到的,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()的地方是使用>>cin中提取。这个并没有提取新行,它只是停在它。

简单地去掉你现在拥有的cin.ignore(),并在cin>>outFileName;后面放置一个。

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

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

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

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

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