2016-05-15 3 views
-3

У меня есть функция:Read File в Loop C++

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

Теперь я хочу прочитать два файла: INPUT1.txt и INPUT2.txt в цикле, такие как:

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

Вопрос в том, как правильно определить цикл.

Спасибо за ваше время заранее.

Вот весь код:

#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; 
} 

КИ, все хорошо, теперь я могу скомпилировать в C++ 98 путем преобразования строки в константный полукокс и stringstream вместо to_string. Моя цель состояла в том, чтобы запустить автоматическую программу с входными файлами в одном каталоге. Предложения о возможном дублировании вопроса не достигают этого, поскольку я должен передать номер входного файла, как я выполняю, как я понимаю, что нецелесообразно для 3000 файлов.

+1

Почему бы не просто «ReadInput» («Input1.txt») 'then' 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

Спасибо Andreas DM, но у меня есть проблема получения правильного ответа. Скажем, у меня есть файл с именем INPUT1.txt с 3 значениями: 50 50 50. Код как есть не реально 50 50 50, но дает мне 6422476 6422296 435480. Любые идеи почему? – user147813

+0

@ user147813 работает правильно для меня. Я не уверен, что вы делаете по-другому –

+0

как я могу покончить с to_string в C++ 98? Я знаю, что мне нужно использовать stringstream, но точно не знаю. – user147813

1

Если у вас есть несколько файлов (до n_max+1), с именами вида «INPUTn.txt», где петля будет оправданным, то следующий будет потенциальным решением:

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

Это требует изменения ReadInput к:

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

вместо использования const char*.

Если у вас нет C++11 доступа, а затем использовать это в месте из std::to_string:

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

Спасибо ,Однако при компиляции я получаю две ошибки: «имя» не было объявлено в этой области, а «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