C ++将多个.txt文件读入字符串数组

时间:2016-04-20 21:58:35

标签: c++ arrays string loops for-loop

所以我有一个包含不同.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];
}

这是查找文件名的功能,但实际上它有一些问题。请帮我。

2 个答案:

答案 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]会导致不可预测的结果,导致程序崩溃,只是错误