首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法通过从c++中的另一个文件读取文件名来打开该文件

无法通过从c++中的另一个文件读取文件名来打开该文件
EN

Stack Overflow用户
提问于 2013-04-23 21:04:28
回答 3查看 779关注 0票数 1

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

代码语言:javascript
复制
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
    }
} 
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-23 21:17:12

您的代码使用了过于复杂的结构。为什么不直接用C++的方式呢:

代码语言:javascript
复制
#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
    }
} 
票数 4
EN

Stack Overflow用户

发布于 2013-04-23 21:11:25

freopen的手册页上写着:

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

因此,

代码语言:javascript
复制
freopen("input1.txt","r",stdin);

关闭stdin流,然后

代码语言:javascript
复制
freopen(file,"r",stdin);

找不到要与file关联的开放流。

您可能应该简单地对文件input.txt执行fopen操作,然后从该文件中进行读取,以便将stdin留给最终目标。

票数 1
EN

Stack Overflow用户

发布于 2013-04-23 21:28:57

需要考虑的几件事:

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

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

这两点将修复你的特定错误(正如@Angew指出的那样)

  • 更喜欢使用std::stringstd::getline,而不是char file[100];,这避免了读取超过100个字符时的缓冲区溢出(我相信您不会检查错误),并简化了代码。

与按索引迭代相比,

  • 更喜欢迭代器。

这意味着不是:

代码语言:javascript
复制
for(int i=0;i < cityNumber;i++)
    adj[i].clear();

你可以/应该这样写:

代码语言:javascript
复制
// C++11
for(auto& city: adj)
    city.clear();

// C++98
for(<type of adj>::iterator city = adj.begin(); city != adj.end(); ++city)
    city->clear();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16170104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档