1

您好我正在尝试从另一个文件中读取文件名,然后读取它。但我只能读取第一个文件,其中包含我要打开的第二个文件的名称。这就是我的做法..

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

3 回答 3

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
    }
} 
于 2013-04-23T13:17:11.800 回答
1

手册页freopen说:

freopen()函数打开文件名是指向的字符串,path并将流指向的流与它相关联。原始流(如果存在)已关闭。

因此,

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

关闭stdin流,并且

freopen(file,"r",stdin);

找不到要关联的打开流file

您可能应该简单fopen地读取文件input.txt并从中读取以离开stdin最终目标。

于 2013-04-23T13:11:25.353 回答
1

有几点需要考虑:

  • 不要在 C++ 中使用 freopen/fopen 文件系列(除非它是一个非常特殊的情况)

  • 不要将 std::iostreams 与 fopen 文件系列混合(此处不应使用 freopen)

    这两点将解决您的特定错误(正如@Angew 指出的那样)

  • 如果读取超过 100 个字符(我相信您不会检查错误),这可以避免缓冲区溢出std::string,并简化您的代码。std::getlinechar file[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();
于 2013-04-23T13:28:57.497 回答