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