2016-05-15 21 views
-3

私が機能を持っている:ループ内INPUT1.txtとINPUT2.txt、など:読むファイル

int main() 
{ 
    for (int i = 1; i < 3; i++){ 
     ReadInput(INPUT$i); 
    } 
    return 0;  
} 

void ReadInput(const char * name) 
{ 
    ifstream file(name); 
    cout << "read file " << name << endl; 
    size_t A0, A1, A2; 
    file >> A0 >> A1 >> A2; 
} 

は、今私は2つのファイルを読み込みたいです問題は、ループを正しく定義する方法です。

お時間をありがとうございます。ここで

全体のコードです:良い、すべて、今私がcharをCONSTとto_stringにするのではなく、にstringstream文字列を変換することにより、C++ 98でコンパイルすることができ、

#include <iostream> 
#include <string> 



using namespace std; 


void ReadInput(const string& _name){ 
    ifstream file(_name); 
    size_t A0, A1, A2; 
    file >> A0 >> A1 >> A2; 
} 


int main() 
{ 


    for (int i = 1; i < 3; ++i) { 
     string file_name = "INPUT" + to_string(i) + ".txt"; 
     ReadInput(file_name); 
    } 

    return 0; 
} 

OK。私の目標は、入力ファイルをすべて同じディレクトリに置いて自動化されたプログラムを実行することでした。可能な重複についての提案は、私が実行するときに入力ファイル番号を渡す必要があるため、私はそれを理解しています.3,000のファイルに対しては実用的ではありません。

+1

なぜ 'ReadInput(" Input1.txt ")'と 'ReadInput(" Input2.txt ")'をしないのですか?あなたは本当にループを必要としない2つのファイルだけです。 – ArchbishopOfBanterbury

+0

読み込むファイルが99個ある場合はどうなりますか? – bumbeishvili

+0

@datoそれは別の話ですが、ここではそうではありません。 – ArchbishopOfBanterbury

答えて

0

は、以下のコード内でいくつかのことを修正しました。 std::to_stringが動作するためにあなたは、少なくとも-std=c++11

#include <iostream> 
#include <string> 
#include <fstream> // you need this for std::ifstream 

using namespace std; 

void ReadInput(const string& _name){ 
    // ifstream file(name); should be '_name' 
    ifstream file(_name); 
    // size_t A0, A1, A2 - what if your file contains characters? 
    string A0, A1, A2; 
    file >> A0 >> A1 >> A2; 

    // output 
    cout << "File: " << _name << '\n'; 
    cout << A0 << " " << A1 << " " << A2 << '\n'; 
} 

int main() 
{ 
    for (int i = 1; i < 3; ++i) { 
     string file_name = "INPUT" + to_string(i) + ".txt"; 
     ReadInput(file_name); 
    } 

    return 0; 
} 

フラグを使用してコンパイルする必要があるか、ファイルが長い場合、あなたはstd::getline

void ReadInput(const string& _name){ 
    ifstream file(_name); 

    string line; 
    cout << "File: " << _name << '\n'; 
    while (getline(file, line)) { 
     cout << line << '\n'; 
    } 
} 
+0

ありがとうございます。正しい答えを得るのに困った。 50 50 50という3つの値を持つINPUT1.txtという名前のファイルがあるとします。コードは実際の50 50 50ではなく6422476 6422296 435480です。 – user147813

+0

@ user147813が正しく動作します。あなたがどうやって別のことをしているのか分かりません –

+0

どうすればC++ 98でto_stringをやることができますか?私はstringstreamを使用しなければならないが、正確にはどうやっているのかわからない。 – user147813

1

あなたはループが保証されるだろうフォーム「INPUTn.txt」の名前を持つ(n_max+1まで)ファイルの数を、持っている場合は、次のように潜在的な解決策のようになります。

for (int i = 1; i < n_max; ++i) { 
    std::string file_name = "INPUT" + std::to_string(i) + ".txt"; 
    ReadInput(file_name); 
} 
代わりに const char*を使用しての

void ReadInput(const std::string& _name); 

これはにReadInputを変更することが必要です。

インプレースstd::to_stringのこれを使用し、その後、C++11アクセス権を持っていない場合:

#include <sstream> 
//... 
template<typename T> std::string to_string(const T& x) { 
    return static_cast<std::ostringstream&>((std::ostringstream() << std::dec << x)).str(); 
} 
+0

ありがとう。しかし、コンパイル時に2つのエラーが発生します。 'name'はこのスコープで宣言されておらず、 'to_string'はこのスコープで宣言されていません。 – user147813

+0

@ user147813おそらく '#include ' – ArchbishopOfBanterbury

+0

私はそれを追加しましたが、同じエラーがそのまま残ります。私は私の質問にコードを追加しました。何が間違っているのですか? – user147813

0

を使用して読むことをお勧めします、私は何を思い、心に留めておいてください欲しいです:

詳細について
int main (int argc, char* argv[]) 
{ 
    using namespace std; 
    for (int i = 1; i < argc; ++i) { 
     string file_name = string(argv[i]) + to_string(i) + ".txt"; 
     ReadInput(file_name); 
    } 

    return 0; 
} 

参照:https://stackoverflow.com/a/3024202/3537677