2013-06-03 20 views
0

我想提取和分析大型文本文件中的數據。數據包含浮點數,整數和單詞。如何從包含空格和換行符的文本文件中提取特定數據?

我想這樣做的方法是使用std :: getline()提取一個完整的行(最多換行)。然後從前面提取的行中提取單個數據(提取直到空白,然後重複)。

到目前爲止,我有這樣的:

int main() 
{ 
    std::ifstream myfile; 
    myfile.open("example.txt", std::ios::in); 

    if(!(myfile.is_open())) 
    { std::cout << "Error Opening File"; 
     std::exit(0); } 

    std::string firstline; 


    while(myfile.good()) 
    { 
     std::getline(myfile, firstline); 
     std::cout<< "\n" << firstline <<"\n"; 
    } 

    myfile.close(); 
    return 0; 
} 

我有幾個問題:

1)我如何提取到一個空白?

2)什麼是最好的方法來存儲數據?大約有7-9個數據類型,並且數據文件很大。

編輯:文件的一個例子是:

結果時間電流路徑要求
PASS 4時31分05秒14.3 Super_Duper_capacitor_413 -39.23
FAIL 4時31分45秒13.2 Super_Duper_capacitor_413 -45.23
。 ..

最終我想分析數據,但到目前爲止我更關心正確的輸入/閱讀。

+0

'getline'有另一個參數來指定分隔符。 – Djon

+0

然後在std :: getline(myfile,firstline)之後使用另一個getline(firstline,'')? – Splaty

+0

是的,我在答案中展示了一個例子。 – Djon

回答

2

您可以使用std::stringstream解析數據並讓它擔心跳過空白處。由於輸入行中的每個元素似乎都需要額外的處理,只需將它們解析爲局部變量,並在所有後處理完成後將最終結果存儲到數據結構中。

#include <sstream> 
#include <iomanip> 


std::stringstream templine(firstline); 

std::string passfail; 
float floatvalue1; 
std::string timestr; 
std::string namestr; 
float floatvalue2; 

// split to two lines for readability 
templine >> std::skipws; // no need to worry about whitespaces 
templine >> passfail >> timestr >> floatvalue1 >> namestr >> floatvalue2; 

如果你不需要或不想要驗證該數據是可以直接解析線到數據結構的正確格式。

struct LineData 
{ 
    std::string passfail; 
    float floatvalue1; 
    int hour; 
    int minute; 
    int seconds; 
    std::string namestr; 
    float floatvalue2; 
}; 

LineData a; 
char sep; 

// parse the pass/fail 
templine >> a.passfail; 
// parse time value 
templine >> a.hour >> sep >> a.minute >> sep >> a.seconds; 
// parse the rest of the data 
templine >> a.timestr >> a.floatvalue1 >> a.namestr >> a.floatvalue2; 
1

對於第一個問題,你可以這樣做:

while(myfile.good()) 
{ 
    std::getline(myfile, firstline); 
    std::cout<< "\n" << firstline <<"\n"; 

    std::stringstream ss(firstline); 
    std::string word; 
    while (std::getline(ss,word,' ')) 
    { 
     std::cout << "Word: " << word << std::endl; 
    } 

} 

至於第二個問題,你能否給我們介紹一下數據類型更精確,你想用一次存儲的數據做的是什麼呢?

+0

請參閱編輯以澄清第二個問題 – Splaty

+0

如果您對C++感到滿意,您可以創建一個可以很好地包裝所有數據的類,但是一個結構體也可以做到這一點,儘管它更像Cish。 – Djon

相關問題