2013-04-23 2 views
1

Привет Я пытаюсь прочитать имя файла из другого файла, а затем прочитать его. Но я могу только прочитать первый файл, который содержит имя второго файла, который я хочу открыть. Вот как я это делаю ..не может открыть файл, читая его имя из другого файла в C++

int main() 
{ 
freopen("input1.txt","r",stdin); 
while(cin>>fileName>>source>>destination) 
{ 
    //reads perfectly 
    char file[100]; 

    for(int i=0;i<(int)fileName.size();i++) 
     file[i] = fileName[i]; 

    file[(int)fileName.size()] = NULL;   

    freopen(file,"r",stdin); 

    mp.clear(); 
    mp1.clear(); 

    for(int i=0;i<cityNumber;i++) 
     adj[i].clear(); 
    cityNumber = 0; 

    while(cin>>city1>>city2>>distanc) 
    { 
     //doesn't read 
    } 
} 
+0

я единственный, кто не знает, что * mp.clear(); mp1 .clear(); * делают? – SChepurin

+0

Я знаю, что должен был удалить их перед публикацией! Но очевидно, что они не имеют никакого отношения к вводу. – Tahlil

ответ

4

В вашем коде используются слишком сложные конструкции. Почему бы просто не сделать это простой C++ путь:

#include <fstream> 

int main() 
{ 
std::ifstream input1("input1.txt"); 
while(input1 >> fileName >> source >> destination) 
{ 
    std::ifstream file(fileName.c_str()); 

    mp.clear(); 
    mp1.clear(); 

    for(int i=0;i<cityNumber;i++) 
     adj[i].clear(); 
    cityNumber = 0; 

    while(file >> city1 >> city2 >> distanc) 
    { 
     //work with values 
    } 
} 
+0

Да, ваше гораздо проще. Благодарю. – Tahlil

+0

Но он показывает ошибку 'variable 'std :: ifstream input1' имеет инициализатор, но неполный тип' – Tahlil

+0

oh он работает.Мне нужно было включить '#include ' – Tahlil

1

страница человек для freopen говорит:

freopen() функция открывает файл, имя которого является строка, на которую указывает path и связывает поток указал потоком с ним. Исходный поток (если он существует) закрыт.

Следовательно,

freopen("input1.txt","r",stdin); 

закрывает поток stdin и

freopen(file,"r",stdin); 

не находит открытый поток ассоциировать с file.

Возможно, вы должны указать fopen файл input.txt и прочитать из него, чтобы оставить stdin для окончательной цели.

1

Несколько вещей, чтобы рассмотреть следующие вопросы:

  • не использовать freopen/FOPEN семейство файлов в C++ (если это действительно особый случай)

  • не смешивать StD :: iostreams с FOPEN семейства файлов (freopen не должны использоваться здесь)

    эти две точки будут фиксировать вашу конкретную ошибку (как пои @Angew nted уходит)

  • предпочитают std::string с std::getline вместо char file[100]; Это позволяет избежать переполнения буфера, если чтение более 100 символов (я верю, что вы не проверить на наличие ошибок) и упрощает код.

  • предпочитает итераторы по итерированию по индексу.

Это означает, что вместо того, чтобы:

for(int i=0;i < cityNumber;i++) 
    adj[i].clear(); 

вы могли бы/должны написать:

// C++11 
for(auto& city: adj) 
    city.clear(); 

// C++98 
for(<type of adj>::iterator city = adj.begin(); city != adj.end(); ++city) 
    city->clear();