2013-11-01 3 views
0

Назначение - сделать тест-грейдер. Первая строка файла - это все ответы , а следующие строки чередуются между именами студентов (LAST, FIRST), и они отвечают на следующую строку. Я могу передать ответы тестового ключа, но когда я пытаюсь использовать функцию getline(), он не сохраняет значение в первом индексе массива, а cin.ignore() просто заставляет мою программу замерзать. Куда я иду отсюда?Как читать чередующиеся строки текста в файле для разделения массивов на C++?

#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]; 
    } 
} 

Выходные данные не принимаются.

+0

Попробуйте выполнить операции 'inFile' вместо' cin'. 'cin' -' stdin', т. е. Консоль, которую вы можете ввести, во время работы программы. 'cin.ignore()' будет приостанавливаться до тех пор, пока вы не нажмете enter в командной строке во время его запуска. Попробуйте 'inFile.getline()'. –

ответ

0

При чередовании форматированного и неформатированного ввода-вывода вам обычно необходимо избавиться от ведущих пробелов! Отформатированный вход (т. Е. При использовании operator>>()) пропускает начальные пробелы (вы можете отключить это с помощью std::noskipws, но это редко полезно). С другой стороны, неформатированный вход, например, std::getline(), не пропускает начальные пробелы. Поскольку форматированный вход для чисел останавливается, когда в потоке есть нечетное число, например, в пробеле или в строке новой строки, пробелы все еще существуют, когда вызывается std::getline(): конец строки с ответами четко обозначается новая линия. std::getline() остановится на этой самой новой строке, что, вероятно, означает, что никакие символы не хранятся и извлекается только новая строка.

Самый простой способ потреблять ведущие пробелы является использование std::ws манипулятором, например .:

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

(поскольку вход всегда может потерпеть неудачу, я не могу заставить себя опустить чек для успешного ввода).

Если вам нужен лучший контроль, например, чтобы пропустить пробелы до и включать новую строку, но без каких-либо пробелов, вам понадобится специальный подход для пропуска пробелов. Это тоже не сложно.