2016-05-12 4 views
1

Я хочу сделать в основном запись функции, которая принимает параметр как имя файла, и если у него есть несколько файлов, он просто примет имя файла в качестве параметра, и он должен делать это повторно с помощью функции. Как я могу это сделать? Спасибо.Как передать файл в качестве параметра в C++?

Txt файлы как этот например, sorular.txt:

// Что самое оживленное страна в мире?
// Китай
// США
// Германия
// Австралия
// Китай

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

м ... Я не думаю, что вы должны продвинуться дальше в своем учебном задании. Поначалу вам просто нужно ** делать базовые обучающие программы/курсы, изучать алгоритмы, процессоры и т.п. После этого вы можете сделать несколько упражнений и ** затем ** вы могли бы попробовать себя на этом. C и C++ просты в освоении, но ** чрезвычайно трудно усвоить ... do ** not ** пропустить несколько шагов, как вы собираетесь делать ... иначе вы потерпите неудачу. Сначала начните с базовых алгоритмов, узнайте о массивах, типах данных, указателях .... это очень важно – specializt

+0

Конечно, вы можете принимать аргументы из командной строки. Аргументы 'argc' и' argv' 'main (int argc, char ** argv)' являются маршрутом к этим аргументам. – Niall

+1

[Кстати] (http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong). – user657267

ответ

0

Прежде всего позвольте мне сказать, что array не может содержать элементы 0, 1, 2, 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)); } 
}; 

Хотя этот класс может показаться подавляющим, что значительно упрощает остальное, что вы пытаетесь acompilsh. С этим классом остальная часть вашего кода будет выглядеть так:

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; 
Смежные вопросы