无法通过从 C++ 中的另一个文件读取文件的名称来打开文件
can't open a file by reading its name from another file in c++
嗨,我正试图从另一个文件中读取一个文件名,然后再读取它。但我只能读取第一个文件,该文件包含我要打开的第二个文件的名称。以下是我的操作方法。
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::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();
相关文章:
- 正在将csv文件读取为双精度矢量
- 将从格式化文本文件读取的文本数据存储到链表
- C++ 读取文件读取文件不正确
- 使用对象文件读取三角形数据网格
- 如何减慢从 BVH 文件读取的 opengl 动画?
- 从文件读取,并写入函数C++中的数组
- 从对象C++中的文件读取内容时出现分段错误
- 从文件读取并通过矢量输出到控制台
- 尝试将字符串从文件读取到无符号字符向量中
- 如何将文本文件读取到二维数组中并以 c++ 打印
- 简化文件读取的函数
- 如何将逗号分隔的文件读取为 2D int 数组?
- 在 c++ 中将数据从文件读取到队列中
- 'std::wstring_convert'尽可能多地转换(从 UTF8 文件读取块)
- C++,从文件读取到结构,然后读取到向量(结构被推入向量太多次,而不仅仅是一次)
- 文件读取C++包括空格键
- 从文件读取时未将值推回矢量
- 从文件 C++ 读取时的无限循环
- 从同一文件读取和写入?
- 从.txt文件读取到C++中的双精度向量