的結構非常簡單:如何從文件中讀取列表與子列表?
- 要領
- 列表項 - 5
- 列表項 - 6
- ...
- 要領
- 名單item - 2
- 列表項 - 3
- ...
爲了便於閱讀我增加了一些分隔符,這是實際的文件:
>Point one
item 1 | 150
item 2 | 20
>Point two
item 1 | 150
item 2 | 10
而且我寫了一個C++函數應該讀它。但我用自己的邏輯糾纏在某個地方,犯了一個錯誤。能找到我嗎?
ifstream fileR("file.txt");
int i = 0;
getline(fileR, sTemp);
do {
if(!sTemp.empty() && sTemp[0]==DELIM){
R[0][i] = sTemp.substr(1);
i++;
}else{
j = 0;
do {
if(!sTemp.empty() && sTemp[0] != DELIM){
string::const_iterator pos = find(sTemp.begin(), sTemp.end(), '|');
string name(sTemp.begin(), pos);
string a_raw(pos + 1, sTemp.end());
a_raw = trim(a_raw);
double amount(atof(a_raw.c_str()));
R[j+1][i].set(trim(name), amount);
j++;
}else{
break;
}
}while(getline(fileR, sTemp));
}
}while(getline(fileR, sTemp));
凡讀值都交給並不重要,因爲我試圖簡化這一功能,因爲它實際上是一些容器與動態數組。我測試了他們,他們工作得很好。所以閱讀有問題。它接縫讀取第一個值很好,但之後它會造成一些混亂。
如果你認爲我的嘗試是一場完全災難,我會歡迎提示如何使一個真正的工作功能。
編輯:
我有一個良好的夜間睡眠,我已經修好了。這裏是一個wokrking版本:
bool read = true;
for(int i = 0; i<n; i++) {
if(read){getline(fileR, sTemp);}else{ read = true; }
if(!sTemp.empty() && sTemp[0]==DELIM){
R[i].setName(sTemp.substr(1));
i--;
}else{
R[i].toFirstSubpoint();
do {
if(!sTemp.empty() && sTemp[0] != DELIM){
string::const_iterator pos = find(sTemp.begin(), sTemp.end(), '|');
string name(sTemp.begin(), pos);
string a_raw(pos + 1, sTemp.end());
a_raw = trim(a_raw);
double amount(atof(a_raw.c_str()));
R[i].setSubpoint(trim(name), amount);
R[i].toNextSubpoint();
}else{
read = false;
break;
}
}while(getline(fileR, sTemp));
}
我的最重要的錯誤是,我忘了,如果被選中狀態,再循環進入下一個索引,並且不執行它的其他(否則)條件。
下面的答案實際上是更好的方法來做到這一點更簡單,更容易理解,但這次我不能使用矢量,我猜測我的腳本應該快一點,因爲它不使用它們。無論如何,下次我會遇到類似的情況,我將使用下面的解決方案。
感謝您的迴應,但每個子列表項都由兩個值組成一個名稱和一個雙變量。 – Povylas 2012-03-14 00:47:12
@Povylas只是申請我遞交給你的東西,而不是一個項目是一個std :: string使它自己的結構與它自己的操作<<。我試試並證明,現在 – 111111 2012-03-14 16:46:58
@Povylas請參閱推薦的代碼。 – 111111 2012-03-14 16:51:43