使用getline c ++从文件中读取

时间:2017-02-21 03:21:01

标签: c++ whitespace ifstream

我有一个看起来像的文件:

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
    }

3 个答案:

答案 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::quotedhttp://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);
    }
}