大输入文本文件每行两个数字,如何更快地输入?

时间:2016-10-28 11:36:43

标签: c++

我有一个文本文件,格式如下 -

1 2

3 4

5 6

所以直到5密耳行。我正在使用此代码进行输入 -

ifstream fin;
fin.open("abc.txt");
while(!fin.eof()){
    fin>>vert>>adj;
    cout<<vert << "  "<<adj;

}

该程序大约需要15分钟来处理输入。有没有办法加快处理速度。

1 个答案:

答案 0 :(得分:1)

您最有可能使用调试版本或标准库的非常糟糕的实现。注意:

  1. 写入文件通常比写入cout更快。
  2. 使用std::endl强制文件刷新,因此非常慢。不要这样做,而是输出换行符'\n'
  3. while(! fin.eof())wrong。永远不要那样做。
  4. 以下是我的结果:

    Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn)
    
    t1=3.00009s
    t2=10.9166s
    t3=18.1806s
    

    测试用例:

    // https://github.com/KubaO/stackoverflown/tree/master/questions/ios-timing-40304260
    #include <fstream>
    #include <iostream>
    #include <chrono>
    using namespace std;
    
    int main() {
       const int N = 5000000;
       const char kFile1[] = "tmp1.txt", kFile2[] = "tmp2.txt";
    
       auto start = chrono::system_clock::now();
       {
          ofstream fOut;
          fOut.open(kFile1);
          for (int i = 0; i < N; ++i)
             // !! DO NOT use endl here!
             fOut << i-N << ' ' << N-i << '\n';
       }
       auto t1 = chrono::system_clock::now();
       cerr << "t1=" << chrono::duration<double>(t1-start).count() << "s" << endl;
    
       double vert, adj;
    
       {
          ifstream fIn;
          ofstream fOut;
          fIn.open(kFile1);
          fOut.open(kFile2);
          while (fIn >> vert && fIn >> adj)
             // !! DO NOT use endl here!
             fOut << vert << ' ' << adj << '\n';
       }
       auto t2 = chrono::system_clock::now();
       cerr << "t2=" << chrono::duration<double>(t2-t1).count() << "s" << endl;
    
       {
          ifstream fIn;
          fIn.open(kFile1);
          while (fIn >> vert && fIn >> adj)
             // !! DO NOT use endl here!
             cout << vert << ' ' << adj << '\n';
       }
       auto t3 = chrono::system_clock::now();
       cerr << "t3=" << chrono::duration<double>(t3-t2).count() << "s" << endl;
    }