无法通过从 C++ 中的另一个文件读取文件的名称来打开文件

can't open a file by reading its name from another file in c++

本文关键字:文件 读取 另一个 C++      更新时间:2023-10-16

嗨,我正试图从另一个文件中读取一个文件名,然后再读取它。但我只能读取第一个文件,该文件包含我要打开的第二个文件的名称。以下是我的操作方法。

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);

找不到要关联到CCD_ 5的开放流。

您可能应该将文件input.txt清空为fopen,并从中读取以将stdin留给最终目标。

需要考虑的几件事:

  • 不要在C++中使用freopen/foopen系列文件(除非是特殊情况(

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

    这两点将修复您的特定错误(正如@Angew所指出的(

  • 更喜欢std::stringstd::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();