Задание состоит в том, чтобы сделать тестового грейдера. Первая строка файла — это все ответы
и следующие строки чередуются между именами учащихся (ПОСЛЕДНИЕ, ПЕРВЫЕ), и они представляют собой ответы в следующей строке. Я могу передать ответы тестового ключа, но когда я пытаюсь использовать функцию 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];
}
}
Выход нулевой.
При переключении между форматированным и неформатированным вводом-выводом обычно требуется избавиться от пробелов в начале! Форматированный ввод (т.е. при использовании operator>>()
) пропускает начальные пробелы (вы можете отключить это, используя std::noskipws
но это редко полезно). С другой стороны, неформатированный ввод, например, std::getline()
, не пропускает ведущие пробелы. Так как форматированный ввод чисел останавливается в тот момент, когда в потоке отсутствует номер, например, в пробеле или новой строке, пробел остается, когда std::getline()
называется: конец строки с ответами четко обозначен новой строкой. std::getline()
остановится на этой самой новой строке, что, вероятно, означает, что никакие символы не сохраняются и извлекается только новая строка.
Самый простой способ использовать лидирующие пробелы — использовать std::ws
манипулятор, например:
if (std::getline(inFile >> std::ws, studentNames[0])) {
// process the student name
}
(поскольку ввод всегда может быть неудачным, я не могу заставить себя опустить проверку на успешность ввода).
Если вы хотите лучше контролировать, например, пропускать пробелы до и включая новую строку, но не пробелы после этого, вам потребуется индивидуальный подход для пропуска пробелов. Это не так сложно сделать, хотя.
Других решений пока нет …