2016-12-07 19 views
0

ファイルから数値を取得するための最速の方法を見つけようとしています。負の数があります。私の元恋人。入力:ファイルから文字列を取得して分割する

5 3 
-5 -6 2 -1 4 
1 2 3 4 
4 3 2 1 

私が使用しているが:

getline(cin, line); 

istringstream linestream(line); 
linestream >> var; 

結果は大丈夫ですが、私のプログラムは最後のテスト、多分分でタイムエラーを実行しています。 100 000の数字。私の質問は、私の解決策よりも文字列を取得して数値に分割する方が速いのですか?時間が最も重要です。

+0

「数字を分割する」とはどういう意味ですか?それらを文字列に変換することを意味しますか? – CroCo

答えて

0

は、あなたがコンパイルコードを投稿していなかった、あなたのランタイムエラーについて

c++ stringstream is too slow, how to speed up?を参照してください、そして、あなたのエラーは、あなたが投稿していなかったものの中にあります。 はCtrlのいずれかである

std::vector<int> numbers; 

int i; 
while(cin >> i) { 
    numbers.push_back(i); 
} 

を使用すると、EOF(ファイルの終わり)を送信する必要がありますcinからの入力を停止するには、信号、:

+0

私は単語を分割するためのより高速なソリューションを探しているからです。 – Khalos

1

あなたの入力中に数字だけがある場合、あなたが行うことができます+ DまたはCtrl + Zご使用のOSによって異なります。

ファイルからの入力は、ファイルの終わりに達すると自動的に停止します。

0

ベストは、ファイルを1行ずつ読み込み、各行要素を配列に入れます(印刷するだけの場合は配列に格納しないでください).C++ストリームの代わりにc関数を使用しています大規模なデータのために、彼らはfaster.The機能が正常に動作しますfgetc_unlockedお使いのシステムに大きなdata.Ifのために使用された場合fscanfはより高速であるfgetc関数を使用する必要がありますので、あなたはそれが

-5 -6 2 -1 4 
1 2 3 4 

が入力のようなものであると仮定しFGETCし交換する必要がありますinput.txtに格納されます。あなたのdirにinput.txtを作成して、同じディレクトリに次のコードを実行してください。後で番号を使用する方法を変更することができます

#include<iostream> 
#include<cstdio> 
using namespace std; 

#define GC fgetc // replace with fgetc_unlocked if it works in your system(Linux) 

//This function takes a line of f and put all integers into A 
//and len is number of elements filled 
void getNumsFromLine(FILE* f, int *A, int& len){ 
    register char ch=GC(f); 
    register int n=0; 
    register bool neg = false; 
    len=0; 

    while(ch!='\n'){ 
     while(ch !='-' && (ch>'9' || ch<'0')) ch=GC(f); 
     if(ch=='-') { 
      neg = true; 
      ch = GC(f); 
     } 
     while(ch>='0' && ch<='9'){ 
      n = (n<<3)+(n<<1)+ch-'0'; 
      ch = GC(f); 
     } 
     if(neg) { 
      n=-n; 
      neg=false; 
     } 
     A[len++]=n; 
     n=0; 
    } 
} 

int main(){ 

    FILE* f=fopen("input.txt", "r"); 
    int A[10][2],len; 
    for(int i=0; i<2; i++){ 
     getNumsFromLine(f, A[i], len); 
     for(int j=0; j<len; j++) cout << A[i][j] <<" "; 
     cout << endl; 
    } 
    fclose(f); 
    return 0; 
} 
関連する問題