您好,我正在尝试从另一个文件中读取文件名,然后读取它。但我只能读取第一个文件,其中包含我要打开的第二个文件的名称。我是这样做的..
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
}
} 发布于 2013-04-23 21:17:12
您的代码使用了过于复杂的结构。为什么不直接用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
}
} 发布于 2013-04-23 21:11:25
freopen的手册页上写着:
freopen()函数打开名称为path所指向的字符串的文件,并将流所指向的流与其相关联。关闭原始流(如果存在)。
因此,
freopen("input1.txt","r",stdin);关闭stdin流,然后
freopen(file,"r",stdin);找不到要与file关联的开放流。
您可能应该简单地对文件input.txt执行fopen操作,然后从该文件中进行读取,以便将stdin留给最终目标。
发布于 2013-04-23 21:28:57
需要考虑的几件事:
这两点将修复你的特定错误(正如@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();https://stackoverflow.com/questions/16170104
复制相似问题