我有一個文本文件,其編號如下: num1 TAB num2 TAB .... num22新行 。 。 。C++文件I/O製表符分隔的數據
我想閱讀num1檢查,看看它是否等於3,如果是將整個行復制到一個新的文件。什麼是最快的方法來做到這一點?該文件是相當大的80Mb +。此外,第1號是重複的,即它以0.001爲步長從0到3。所以我只需要閱讀每一個如此多的步驟。我不知道如何告訴電腦先驗跳過x線?
謝謝。
我有一個文本文件,其編號如下: num1 TAB num2 TAB .... num22新行 。 。 。C++文件I/O製表符分隔的數據
我想閱讀num1檢查,看看它是否等於3,如果是將整個行復制到一個新的文件。什麼是最快的方法來做到這一點?該文件是相當大的80Mb +。此外,第1號是重複的,即它以0.001爲步長從0到3。所以我只需要閱讀每一個如此多的步驟。我不知道如何告訴電腦先驗跳過x線?
謝謝。
給你講了,運行時性能並不是主要問題,那麼下面的簡潔明瞭:
#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支持;爲簡潔起見省略了錯誤處理。)
謝謝。其他請注意,您必須輸入輸入和輸出文件的完整路徑,即用法如下:int main() { \t foo(「F:/ Backup Drive/file_read/Debug/save_data.txt」,「F :/ Backup Drive/file_read/Debug/sorted.txt「); } –
如果由於某種原因你想要2.999而不是3,請使用std :: stod而不是std :: stoi。試過了,它工作! –
快速問題,如何獲取上一行?由於0跟在3之後(在我的數據集中),我想檢查0並存儲上一行。 –
僞代碼可以是這樣的:
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
}
}
謝謝!我用你的僞代碼,但不幸的是SE不讓我選擇多個可接受的答案。如果有辦法追溯創造賞金,請讓我知道。我想給你我的一些代表。 –
您是否確實需要使用C++來執行此操作? ''grep -P'^ 3 \ t'「'或類似的會做你想做的事,而且速度會非常快。 –
您對運行時性能的關注程度如何?這對於stdlib流來說是微不足道的,但如果你擔心開銷,那麼[Boost.Spirit](http://www.boost.org/libs/spirit/).Qi就是要走的路。 – ildjarn
(注意:'grep -P'需要gnu grep) –