繁体   English   中英

使用GetLine C ++从文件读取

[英]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::quotedhttp : //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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM