Привет, я пытаюсь прочитать имя файла из другого файла, а затем прочитать его. Но я могу прочитать только первый файл, который содержит имя второго файла, который я хочу открыть. Вот как я это делаю ..
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
}
}
Ваш код использует слишком сложные конструкции. Почему бы просто не сделать это простым 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
}
}
Справочная страница для freopen
говорит:
freopen()
Функция открывает файл, имя которого является строкой, на которую указываетpath
и связывает поток, на который указывает поток, с ним. Исходный поток (если он существует) закрыт.
Следовательно,
freopen("input1.txt","r",stdin);
закрывает stdin
поток и
freopen(file,"r",stdin);
не находит открытого потока для связи с file
,
Вы должны, вероятно, просто fopen
файл input.txt
и читать с него, чтобы уйти stdin
для конечной цели.
Несколько вещей для рассмотрения:
не используйте семейство файлов 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();