所以我有一个包含不同.txt文件的文件夹,我想从生成的test.txt文件中读取文件名到字符串数组中:
string find_files()
{
string fileNames[20];
system("dir /b > test.txt");
ifstream inFile("test.txt");
if (!inFile)
{
cout << "File cannot be opened." "\n";
return;
}
for (string line; getline(inFile, line); )
{
istringstream in(line);
for (int i = 0; i < 20; i++)
in >> fileNames[i];
}
return fileNames[20];
}
这是查找文件名的功能,但实际上它有一些问题。请帮我。
答案 0 :(得分:0)
问题1: dir /b
应该在文件中每行放一个文件。您的嵌套循环会导致您读取每一行,但是对于每一行,您都会读取嵌套循环中的行内容,并使用i=0
重新启动每一行。因此,每次都覆盖相同且唯一的fileNames[0]
。
问题2:如果您的某个文件名包含空格,则代码in>> fileNames[i];
会将其处理为好像是多个文件名(空格充当分隔符)。
问题3:您无法按值返回数组。 return fileNames[20];
不返回包含20个元素的数组,但返回数组的第21个元素。不幸的是,你走出界限是未定义的行为。
解决方案1和2:
如果您假设每行有1个文件名,则可以执行以下操作:
for (int i; i<20 && getline(inFile, fileNames[i]); i++)
;
如果你想每行阅读几个文件名:
string line;
int i=0;
while (getline(inFile, line) )
{
istringstream in(line);
for ( ; i < 20; i++) // don't reset the counter
in >> fileNames[i];
}
解决方案3:
如果您允许使用矢量,有一种简单的方法可以解决它。然后只需用向量替换数组,并将push_back()
字符串放入其中(没有记录器需要跟踪i计数器)。
如果您不允许这样做,我建议传递数组的地址:
int find_files(string fileNames[], int maxfiles)
{
... // replace 20 by maxfiles
return i; // return the number of elements read.
}
答案 1 :(得分:0)
您是否检查过您的文件是否包含21行文字?如果不是第21个fileNames
数组的字符串将为空。第21个字符串是索引为20的字符串:fileNames[20]
。
而且:for (int i = 0; i < 20; i++)
您正在从0到19迭代i
,它永远不会到达索引20,并且您将从函数返回值fileNames[20]
。
代码中也存在巨大错误。您定义了string fileNames[20];
,它创建了一个包含20个字符串的数组,索引从0到19 。因此,仅使用fileNames[0]
到fileNames[19]
的值才有效。使用fileNames[20]
会导致不可预测的结果,导致程序崩溃,只是错误。