2012-12-28 69 views
2

我正在處理一些文件並試圖加載它們。我想用矢量來存儲最終的信息,所以我可以在全球範圍內保留它,而不需要知道它有多大。這是我的代碼,但計劃沒有完成啓動:結構不能正常工作的C++向量?

std::string one = "v 100.32 12321.232 3232.6542"; 
struct Face {float x, y, z;}; 
std::vector<struct Face> obj; 
char space[3]; 
sscanf(one.c_str(), "%s %f %f %f", space, &obj[1].x1, &obj[1].y1, &obj[1].z1); 
std::cout << obj[1].x1 << std::endl; 
+4

你錯過了'main'和'obj [whatever]'是非法的,因爲最初,因爲代碼是矢量是空的。 –

+0

@LuchianGrigore但是sscanf不向矢量添加東西? – BlueSpud

+2

不,當然不是。你需要'調整大小',給構造函數一個初始大小,或者使用'push_back'。 –

回答

3

默認構造vector s開始爲空,即使編譯器允許您使用operator [],但它的未定義行爲也是如此。

在創建vector雖然你可以分配一些空間:

std::vector<struct Face> obj(2); // Allow enough space to access obj[1]

+0

我可以在聲明後使用obj.resize(5)嗎?我發佈的並不是完整的代碼,而且矢量也不知道直到函數被調用之前它是多少。 – BlueSpud

2

如果你想要寫在向量元素1,矢量必須size() >= 2。在你的例子中,size()總是0.

考慮創建一個臨時的Face,然後push_back - 將其設置爲vector<Face>

1

也許你正在使用sscanf的一個很好的理由,但至少我認爲是很好的點,你可以使用流將信息加載到結構中。

在這種情況下,我建議你使用istringstream類,它可以讓你從字符串中讀取值作爲值,根據需要進行轉換。所以,你的代碼,我想我可以把它改成這樣:

std::string one = "v 100.32 12321.232 3232.6542"; 
struct Face {float x,y,z;}; 
std::vector<struct Face>obj; 
char space[3]; 

// As mentioned previously, create a temporal Face variable to load the info 
struct Face tmp; // The "struct" maybe can be omited, I prefer to place it. 

// Create istringstream, giving it the "one" variable as buffer for read. 
istringstream iss (one); 

// Replace this line... 
//sscanf(one.c_str(), "%s %f %f %f",space,&obj[1].x1,&obj[1].y1,&obj[1].z1); 
// With this: 
iss >> space >> tmp.x >> tmp.y >> tmp.z; 

// Add the temporal Face into the vector 
obj.push_back (tmp); 

// As mentioned above, the first element in a vector is zero, not one 
std::cout << obj[0].x1 << std::endl; 

的istringstream類(你需要包括「sstream」)是在這個情況下是有用的,當你有值從字符串加載。

我希望我的回答能以任何方式幫助你。