[英]Reading from a file using 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
}
getline(videoFile, numCopies); //numCopies should not be an int, but a str.
numCopies是一个int。 做这个:
string numCopiesStr;
getline(videoFile, numCopiesStr);
int numCopies = std::stoi(numCopiesStr);
那应该工作。
另一种方法,但错误处理变得更棘手,是使用std :: cin:
std::cin >> numCopies;
这会将int读取到numCopies变量中,但此后将精确地停在那里,而没有得到完整的行。
您无法使用运算符>>读取由空格分隔的字符串,它将在第一个空格处停止。 您需要getline。
我的建议是您使用字符串numCopiesStr并在每次迭代的循环内将其转换为int。
另一个解决方案(自C ++ 14起)是使用std::quoted
修饰符,如果您可以更改输入文件的格式(在Sister Act中添加引号,例如“ Sister Act”等)。 在这种情况下,只要您引用不是数字的每个字符串,就可以将int直接用于numCopies并执行此操作:
while (std::quoted(videoFile) >> std::quoted(title) ... >> numCopies) {
}
请参阅如何在此处使用std::quoted
: http : //en.cppreference.com/w/cpp/io/manip/quoted
啊,让您的cppreference.com永远贴近您,对您有很大帮助;)
getline(...)的默认行为是从输入流中读取并将其存储在字符串中。 在这里检查。 http://en.cppreference.com/w/cpp/string/basic_string/getline
因此,您将必须执行任何字符串到int的转换技术才能使用getline读取并将其转换为int。
建议:对于从字符串到int的转换,取决于性能与准确性,您可以签出:boost :: coerce或boost :: lexical cast或sscanf或stoi。 检查: boost :: lexical_cast的替代方法
我知道我在这里有用户定义的数据类型,但这是我解决问题的方法。 我在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);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.