stdin — не может открыть файл, прочитав его имя из другого файла в переполнении стека

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

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

1

Решение

Ваш код использует слишком сложные конструкции. Почему бы просто не сделать это простым 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
}
}
4

Другие решения

Справочная страница для 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)

  • предпочитать 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();
1
По вопросам рекламы [email protected]