我有一个看起来像的文件:
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 :(得分: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);
这应该有效。
另一种方法,但错误处理变得棘手,就是使用std :: cin:
std::cin >> numCopies;
这会将int读入numCopies变量,但会完全停在那里,之后不会得到整行。
您无法通过运算符>>读取由空格分隔的字符串,它将在第一个空格处停止。你需要getline。
我的建议是你使用字符串numCopiesStr并在每次迭代的循环中转换为int。
另一个解决方案(因为C ++ 14)是使用std::quoted
修饰符,如果你可以改变输入文件的格式(添加引号给Sister Act,例如" Sister Act"等)。在这种情况下,您可以直接对numCopies使用int并执行此操作,只要您引用每个不是数字的字符串:
while (std::quoted(videoFile) >> std::quoted(title) ... >> numCopies) {
}
在此处查看如何使用std::quoted
:http://en.cppreference.com/w/cpp/io/manip/quoted
啊,让你的cppreference.com永远贴近你,它可以帮助很多;)
答案 1 :(得分:0)
getline(...)的默认行为是从输入流中读取并将其存储在字符串中。点击这里http://en.cppreference.com/w/cpp/string/basic_string/getline
因此,您必须执行任何字符串到int转换技术以使用getline进行读取并将其转换为int。
建议:要从字符串转换为int,根据性能与准确度的不同,您可以查看:boost :: coerce或boost :: lexical cast或sscanf或stoi。检查: Alternative to boost::lexical_cast
答案 2 :(得分: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);
}
}