2016-05-12 14 views
1

基本的には、パラメータをファイル名としてとり、複数のファイルを持つ場合はパラメータとしてファイル名をとり、それを関数で繰り返し実行する必要があります。これどうやってするの?おかげさまで どのようにファイルをC++のパラメータとして渡すことができますか?

TXTファイルは、例えば、この のようなもので、sorular.txt:

//世界で最も混雑した国は何ですか?
//中国
// USA
//ドイツ
//オーストラリア
//中国

int main(){ 

    string array [5]; 
    string line; 
    string answer; 
    static int trueCount = 0; 
    static int falseCount = 0; 
    ifstream file("/Users/User/QuizMaker/Quiz Maker V2/sorular.txt"); 

    if(file.is_open()){ 
     cout << "Questions are loading... Please wait.."<<endl<<" ."<<endl<<" ."<<endl<<" ."<<endl; 
     while (!file.eof()) { 
      for (int i = 0; i<6; i++) { 
       getline(file,array[i]); 
      } 

      for (int a = 0; a<5; a++) { 
        cout << array[a] << endl; 
      } 
      cin >> answer; 

      if(answer == "C" || answer == "c") { 
       cout << true; 
       trueCount++; 
      } 
      else falseCount++; 
     } 

     cout << "You answered "<<trueCount << " questions as true" << endl; 
     cout << "You answered "<<falseCount << " questions as false" << endl; 
     file.close(); 
    } else cout << " not ıoen"; 

    cin.get(); 

    return 0; 
} 
+2

uhm ...私はあなたの学習クエストをさらに進めるべきだと思います。最初は、基本的なプログラミングのチュートリアル/コースを行うには、**必要があります**、アルゴリズムやプロセッサなどについて学ぶだけです。その後、あなたはいくつかのエクササイズをして、** **あなたはそれのようなものであなた自身を試すことができます。 CとC++は簡単に学ぶことができますが、非常に**習得するのは難しいです** **あなたがやろうとしているようないくつかのステップをスキップしないでください。そうしないと失敗します。基本的なアルゴリズムから始めて、配列、データ型、ポインタについて学んでください....非常に重要です – specializt

+0

もちろん、コマンドラインから引数を受け入れることができます。 'main(int argc、char ** argv)'の 'argc'と' argv'はこれらの引数へのルートです。 – Niall

+1

[参考](http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong) – user657267

答えて

0

まず、arrayは要素012を保持することができないことを、私は言わせて3,4および5。 5つの要素しか割り当てられていません。


これは、あなたの地平を少し伸ばすかもしれませんが、私は正しい解決策がここにあると思います。だから私はこれを一緒にハックするつもりです、あなたが興味を持っているなら、私が少しやったことを研究することができます。

class foo : public iterator<input_iterator_tag, string> { 
    const initializer_list<const char*> _files; 
    decltype(_files)::const_iterator _filesIt; 
    ifstream _file; 
    string _line; 

    void get() { 
     string array[6]; 
     auto i = begin(array); 

     while (i != end(array) && getline(_file, *i)) { 
      advance(i, 1); 
     } 

     if (i == end(array)) { 
      _line = accumulate(cbegin(array), cend(array), string(), [](const auto& a, const auto& b) { return a.empty() ? b : a + '\n' + b; }); 
     } else if(++_filesIt != cend(_files)) { 
      _file.close(); 
      _file.open(*_filesIt); 
      get(); 
     } 
    } 
public: 
    foo() : _filesIt(cend(_files)) {} 
    foo(foo& rhs) : _files(rhs._files), _filesIt(next(cbegin(_files), distance(cbegin(rhs._files), rhs._filesIt))), _line(rhs._line) { 
     if (_filesIt != cend(_files)) { 
      _file.open(*_filesIt); 
      _file.seekg(rhs._file.tellg()); 
     } 
    } 
    foo(const initializer_list<const char*>&& files) : _files(files), _filesIt(cbegin(_files)), _file(*_filesIt) { get(); } 
    const string& operator*() const { return _line; } 
    const foo& operator++() { 
     get(); 
     return *this; 
    } 
    const foo operator++(int) { 
     foo result; 

     get(); 
     return result; 
    } 
    bool operator==(const foo& rhs) { return distance(_filesIt, cend(_files)) == distance(rhs._filesIt, cend(rhs._files)); } 
    bool operator!=(const foo& rhs) { return distance(_filesIt, cend(_files)) != distance(rhs._filesIt, cend(rhs._files)); } 
}; 

このクラスは圧倒的に見えるかもしれませんが、あなたが納得しようとしているものの残りの部分を大幅に簡略化します。このクラスを使用すると、残りのコードは次のようになります。

auto true_count = 0; 
auto false_count = 0; 

for_each(foo({"/Users/User/QuizMaker/Quiz Maker V2/sorular.txt", "foo.txt", "bar.txt"}), foo(), [&](const auto& i) { 
    string answer; 

    cout << i << endl; 
    cin >> answer; 

    if(answer == "C" || answer == "c") { 
     cout << 1; 
     true_count++; 
    } else { 
     false_count++; 
    } 
}); 
cout << "You answered "<< trueCount << " questions as true" << endl << "You answered " << falseCount << " questions as false" << endl; 
関連する問題