2012-08-28 40 views
-1

我有一個文本文件,其編號如下: num1 TAB num2 TAB .... num22新行 。 。 。C++文件I/O製表符分隔的數據

我想閱讀num1檢查,看看它是否等於3,如果是將整個行復制到一個新的文件。什麼是最快的方法來做到這一點?該文件是相當大的80Mb +。此外,第1號是重複的,即它以0.001爲步長從0到3。所以我只需要閱讀每一個如此多的步驟。我不知道如何告訴電腦先驗跳過x線?

謝謝。

+1

您是否確實需要使用C++來執行此操作? ''grep -P'^ 3 \ t'「'或類似的會做你想做的事,而且速度會非常快。 –

+0

您對運行時性能的關注程度如何?這對於s​​tdlib流來說是微不足道的,但如果你擔心開銷,那麼[Boost.Spirit](http://www.boost.org/libs/spirit/).Qi就是要走的路。 – ildjarn

+0

(注意:'grep -P'需要gnu grep) –

回答

1

給你講了,運行時性能並不是主要問題,那麼下面的簡潔明瞭:

#include <string> 
#include <fstream> 

void foo(std::string const& in_fn, std::string const& out_fn) 
{ 
    std::ifstream is(in_fn); 
    std::ofstream os(out_fn); 

    std::string line; 
    while (std::getline(is, line)) 
     if (line.size() && std::stoi(line) == 3) 
      os << line << '\n'; 
} 

(C +假設爲+11支持;爲簡潔起見省略了錯誤處理。)

+0

謝謝。其他請注意,您必須輸入輸入和輸出文件的完整路徑,即用法如下:int main() { \t foo(「F:/ Backup Drive/file_read/Debug/save_data.txt」,「F :/ Backup Drive/file_read/Debug/sorted.txt「); } –

+0

如果由於某種原因你想要2.999而不是3,請使用std :: stod而不是std :: stoi。試過了,它工作! –

+0

快速問題,如何獲取上一行?由於0跟在3之後(在我的數據集中),我想檢查0並存儲上一行。 –

1

僞代碼可以是這樣的:

while (not eof) { 
    fgets(...); 
    find TAB symbol or end of line 
    get string between two marks 
    cleain it from spaces and other unnecessary symbols 
    float fval = atof(...); 
    if (fval == 3) { 
     write the string into new file 
    } 

} 
+0

謝謝!我用你的僞代碼,但不幸的是SE不讓我選擇多個可接受的答案。如果有辦法追溯創造賞金,請讓我知道。我想給你我的一些代表。 –

相關問題