2017-02-21 31 views
1

У меня есть файл, который выглядит как:Чтение из файла с помощью GetLine C++

Sister Act 
Whoopi GoldBerg 
Maggie Smith 
Schwartz 
Ardolino 
Touch Stone Pictures 
14 

У меня возникли проблемы с чтением в информации и сохранения его на объект. Я не получаю никаких ошибок, но я не могу заставить программу правильно читать информацию.

Мой вопрос: может ли кто-нибудь сказать мне, что мне нужно изменить, чтобы моя программа правильно прочитала файл.

Также каждая строка может иметь несколько слов и пробелов для целого, за исключением в строке 7.

string title, starName1, 
    starName2, producer, 
    director, prodCo; 
int numCopies; 
ifstream videoFile("videoDat.txt"); 

if (videoFile.is_open()) { 
    getline(videoFile, title); 
    getline(videoFile, starName1); 
    getline(videoFile, starName2); 
    getline(videoFile, producer); 
    getline(videoFile, director); 
    getline(videoFile, prodCo); 
    //getline(videoFile, numCopies); //compiler error 

    while (videoFile >> title >> starName1 >> starName2 >> producer >> director >> prodCo >> numCopies) { 
     //be able to do stuff with variables individually 
    } 
} 

Я думал, я должен был сделать что-то вроде:

while (getline(videoFile, title) && getline(videoFile, starName1) && getline(videoFile, starName2) 
     && getline(videoFile, producer) && getline(videoFile, director) && getline(videoFile, prodCo) && videoFile >> numCopies) { 
     //be able to do stuff with variables individually 
    } 
+0

Просьба [MCVE] (http://stackoverflow.com/help/mcve), сложно рассуждать о компиляции и корректности ошибок, когда есть много типов, определяемых пользователем в фрагменте. – yeputons

+0

Я попытался отредактировать оставляя только код, который дает мне проблемы без пользовательских типов. – Asuu

ответ

2
getline(videoFile, numCopies); //numCopies should not be an int, but a str. 

numCopies является int. Сделайте это:

string numCopiesStr; 

getline(videoFile, numCopiesStr); 
int numCopies = std::stoi(numCopiesStr); 

Это должно сработать.

Другой способ, но обработка ошибок становится сложнее, заключается в использовании станд :: CIN:

std::cin >> numCopies; 

Это будет читать Int в numCopies переменной, но остановится точно, после этого, не получая полная линия.

Вы не можете прочитать строки, разделенные пробелами с помощью оператора >>, он остановится в первом пространстве. Вам нужен getline.

Моя рекомендация заключается в том, что вы используете строку numCopiesStr и конвертируете в int внутри цикла для каждой итерации.

Другое решение (начиная с C++ 14) заключается в использовании модификатора std::quoted, если вы можете изменить формат входного файла (добавьте цитаты в «Закон о сестре», например «Закон о сестре» и т. Д.). В этом случае вы могли бы использовать Int непосредственно numCopies и делать это, до тех пор, как вы цитируете каждую строку, которая не цифры:

while (std::quoted(videoFile) >> std::quoted(title) ... >> numCopies) { 
} 

Посмотрите, как использовать std::quoted здесь: http://en.cppreference.com/w/cpp/io/manip/quoted

Ах, и держать ваш cppreference.com всегда рядом с вами, он может многое помочь;)

+0

Это решило мою проблему с некоторыми проб и ошибок. Послушай меня, верь мне, спасибо. – Asuu

0

Поведение getline (...) по умолчанию должно считываться из входного потока и хранить его в строке. Проверьте здесь. http://en.cppreference.com/w/cpp/string/basic_string/getline

Таким образом, вам нужно будет использовать любую из методов преобразования строк в int, чтобы читать с помощью getline и преобразовывать их как int.

Предложение: Для преобразования из строки в int, в зависимости от производительности и точности, вы можете проверить: boost :: coerce или boost :: lexical cast or sscanf или stoi. Проверка: Alternative to boost::lexical_cast

0

Я знаю, что у меня есть определенные пользователем типы данных, но это то, что я сделал для решения проблемы. Я прочитал его как строку в моем цикле while, а затем преобразовал его в целое число, используя stoi. Спасибо всем за помощь!

 while (getline(videoFile, title) && getline(videoFile, starName1) 
     && getline(videoFile, starName2) && getline(videoFile, producer) 
     && getline(videoFile, director) && getline(videoFile, prodCo) 
     && getline(videoFile, numCopiesStr)) { 
     tempVideo.setVideos(title, starName1, starName2, producer, director, prodCo, stoi(numCopiesStr)); 
     videos.addNodeToTail(tempVideo); 
    } 
}