簡體   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