2016-04-20 161 views
0

所以我有不同的.txt文件的文件夹,我想阅读生成test.txt文件的文件名到字符串数组:C++读取多个.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

三跳在我身上:'for(int i = 0; i <20; i ++)'那条线上可能没有20个项目。 'for(string line; getline(inFile,line);)'在第20行中读取第一行。那么文件中的第二条,第三条和之后的行也是如此。 'return fileNames [20];'将在20个元素数组中返回不存在的第21项,而不是数组。 – user4581301

回答

0

问题1:dir /b应在文件中每行放置一个文件。您的嵌套循环会导致您读取每一行,但对于每一行,您都可以在嵌套循环中读取行内容,每次使用i=0重新开始。所以你每次都会覆盖相同和独特的fileNames[0]

问题2:如果您的文件名中的一个将含有的空间,则代码in>> fileNames[i];将处理它,就好像它是几个文件名(空间充当分离器)。

问题3:您不能按值返回数组。 return fileNames[20];不返回一个包含20个元素的数组int,但返回数组的第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:

有一个简单的方法可以解决它,如果你被允许使用矢量。然后,用一个向量替换数组,并将其中的字符串(不需要记录器记录i计数器)。

如果你不能这样做,我建议通过数组的地址:

int find_files(string fileNames[], int maxfiles) 
{ 
    ... // replace 20 by maxfiles 
    return i; // return the number of elements read. 
} 
0

你检查,如果你的文件有21行文字呢?如果不是第21列的fileNames数组将为空。第21个字符串是索引为20的字符串:fileNames[20]

兼:for (int i = 0; i < 20; i++) 你迭代i从0到19,它永远不会达到目标20,你是从你的函数返回值fileNames[20]

代码中也有一个巨大的错误。您定义了string fileNames[20];,它创建了一个20个字符串的数组,索引为,从0到19。因此,只能使用fileNames[0]fileNames[19]之间的值。使用fileNames[20]会导致不可预知的结果,崩溃你的程序,那简直就是错误