0

任务是做一个测试评分员。文件的第一行是所有答案,下一行在学生姓名(LAST,FIRST)之间交替,它们是下一行的答案。我能够传递测试关键答案,但是当我尝试使用 getline() 函数时,它不会将值存储到数组的第一个索引中,而 cin.ignore() 只会导致我的程序冻结。我从这里去哪里?

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

typedef char answerKey[30];
typedef string studentNames[25];

int main()
{

    fstream inFile;

    inFile.open("xfile.txt");
    if (!inFile)
    {
        cout << "ERROR FILE NOT FOUND" << endl;
        return (EXIT_FAILURE);
    } else {

        for (int i = 0; i < 30; i++)
            inFile >> answerKey[i];

        getline(inFile, studentNames[0]);

        cout << studentNames[0];  
    }
}

输出为空。

4

1 回答 1

0

在格式化和未格式化的 I/O 之间交替时,您通常需要去掉前导空格!格式化的输入(即使用时operator>>())会跳过前导空格(您可以使用关闭它,std::noskipws但它很少有用)。另一方面,未格式化的输入,例如 ,std::getline()不会跳过前导空格。由于数字的格式化输入在流中存在非数字时停止,例如,在空格或换行符上,因此在std::getline()调用时空格仍然存在:带有答案的行尾由换行符清楚地指示. std::getline()将停在这个换行符上,这可能意味着没有存储任何字符,只提取换行符。

使用前导空格的最简单方法是使用std::ws操纵器,例如:

if (std::getline(inFile >> std::ws, studentNames[0])) {
    // process the student name
}

(由于输入总是会失败,我不能让自己忽略对成功输入的检查)。

如果您想要更好的控制,例如,跳过空格直到并包括换行符,但之后不包含任何空格,您将需要一种自定义方法来跳过空格。不过,这也不难做到。

于 2013-11-01T20:53:44.803 回答