您好我正在尝试从另一个文件中读取文件名,然后阅读它。但我只能读取第一个文件,其中包含我要打开的第二个文件的名称。我是这样做的..
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 :(得分: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
}
}
答案 1 :(得分:1)
freopen
的手册页说:
freopen()
函数打开文件,其名称是path
指向的字符串,并将stream指向的流与之关联。原始流(如果存在)已关闭。
因此,
freopen("input1.txt","r",stdin);
关闭stdin
流,
freopen(file,"r",stdin);
找不到要与file
关联的开放流。
您应该明确fopen
文件input.txt
并从中读取,以便stdin
留下最终目标。
答案 2 :(得分:1)
需要考虑的一些事项:
不要在C ++中使用freopen / fopen文件系列(除非是特殊情况)
不要将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();