2013-05-20 60 views
3

首先,對不好的英語感到抱歉。好吧,我想讀在使用該程序變量obj文件(見here),並將它們存儲的值:使用C++讀取和存儲來自.OBJ文件的值

#include <iostream> 
#include <fstream> 
#include <string> 
#include <sstream> 
using namespace std; 

int main() 
{ 
string line; 
string v, valuesX[8], valuesY[8], valuesZ[8]; 
int n = 0; 

ifstream myfile ("cubo.obj"); 
while(!myfile.eof()) 
{ 
    getline (myfile,line); 
    if (line[0] == 'v') 
    { 
     myfile >> v >> valuesX[n]>> valuesY[n]>> valuesZ[n]; 
     cout << valuesX[n] << "\t" << valuesY[n] << "\t" << valuesZ[n] << endl; 
     n++; 
    } 
} 
return 0; 
} 

的文件,這只是一個簡單的立方體,通過攪拌機出口。我希望他給我看所有以「v」開頭的行,但結果只顯示奇數的「v」行。當我直接讀取變量「line」的值時,結果是一樣的。但是,當我刪除將值賦予變量「value」並直接讀取變量「line」的行時,該程序完美工作。任何人都知道向我解釋發生了什麼?爲什麼程序忽略了偶數行?

+1

的問題是,'getline'讀取一行,然後你讀取下一行,當你做'MYFILE >> V >> valuesX [N] >> valuesY [n] >> valuesZ [n];'。 –

回答

1

正如我在我的評論中提到的,你看一個符合:

getline (myfile,line); 

,然後如果線路在第一位置具有v你閱讀這種說法另一行:

myfile >> v >> valuesX[n]>> valuesY[n]>> valuesZ[n]; 

但是您不會處理上一行的getline,因此您將失去該行。一個可能的解決辦法是處理每個line是匹配使用istringstraeam

std::istringstream iss(line); 
iss >> v >> valuesX[n]>> valuesY[n]>> valuesZ[n]; 
+0

我懷疑了!對於我的測試,我懷疑這個命令是這樣的,只是不知道如何,但你解釋得很好,你的解決方案工作!謝謝! :d – user2400078

2

您正在閱讀每環2線:

首播時間:

getline(myfile, line); 

二時間:

myfile >> v >> valuesX[n] >> valuesY[n] >> valuesZ[n]; 

所以,你丟棄一半的數據。

解決方案:嘗試使用ifstream::peek功能,看是否符合一個'v'開始,那麼你會閱讀所有的值到您的變量。

+0

或離開getline並執行類似 'std :: stringstream lineStream; lineStream << line;' 然後只在導致第二次讀取的部分將'myfile'切換到'lineStream'。 – Julius

+0

問題是這樣,但我認爲最好甚至使用「istringstraeam」。無論如何,謝謝! :D – user2400078

相關問題