2012-07-13 79 views
0

我有一个存储在文本文件中的文件列表。我一行一行地读取文件,并将它们存储在一个字符串数组中。文件列表如下所示:如何从文本文件中读取文件名列表并在C++中打开它们?

04_02_1310.csv 
04_03_1350.csv 
04_04_0421.csv 
04_05_0447.csv 

等等。让我们把我的字符串数组

filelist[i] 

假设我想在列表中打开的第一个文件:

inputFile.open(filelist[0].c_str()); // This cannot open file 

文件无法打开。如果我用引号将文件名,一切顺利罚款:

inputFile.open("04_02_1310.csv"); // This works perfectly 

如果我打印的文件列表中的内容[I],然后正常工作,以及:

cout << filelist[0] << endl; // This outputs 04_02_1310.csv on screen. 

有人可以告诉我上面的方法有什么问题?这使我在过去的2天内疯狂,而我正在手动输入所有内容,以便完成它(100个以上的文件)。

我也愿意以其他任何方式来完成这个简单的任务。

谢谢!

编辑:再次

Data file could not be opened 

感谢:我添加的代码的相关部分,如果你想看看它是如何实现的:

#include <cstdlib> 
#include <iostream> 
#include <time.h> 
#include <string> 
#include <sstream> 
#include <fstream> 
#include <vector> 
#include <algorithm> 
#include <iterator> 

using namespace std; 

//Declarations for I/O files 
ifstream inputFile; 

//Declare other variables (forgot to add these in my previous EDIT, sorry) 
int number_of_files; 
string line; 
string *filelist = NULL; 

//Open file list and count number of files 
inputFile.clear(); 
inputFile.open("filelist.txt", ios::in); 

//exit and prompt error message if file could not be opened 
if (!inputFile){ 
    cerr << "File list could not be opened" << endl; 
    exit(1); 
}// end if 

// count number of lines in the data file and prompt on screen 
number_of_files = 0; 

while (getline(inputFile, line))   
    number_of_files++; 

cout << "Number of files to be analyzed: " << number_of_files << endl; 

filelist = new string[number_of_files]; 
inputFile.close(); 

//Re-open file list and store filenames in a string array 
inputFile.clear(); 
inputFile.open("filelist.txt", ios::in); 

//exit and prompt error message if file could not be opened 
if (!inputFile){ 
    cerr << "File list could not be opened" << endl; 
    exit(1); 
}// end if 

// store filenames 
i = 0; 
while (getline(inputFile, line)){ 
    filelist[i] = line; 
    //cout << filelist[i] << endl; 
    i = i + 1; 
}   

inputFile.close(); 

//open first file in the list, I deleted the loop to focus on the first element for now 

inputFile.clear(); 
inputFile.open(filelist[0].c_str(), ios::in); 

//exit and prompt error message if file could not be opened 
if (!inputFile){ 
    cerr << "Data file could not be opened" << endl; 
    exit(1); 
}// end if 

的输出!

+2

什么'COUT <<文件列表[0] .c_str()<< ENDL;'或'COUT <<文件列表[I] .c_str()<< ENDL;'? – 2012-07-13 15:58:50

+4

你可以发布循环? – pearcoding 2012-07-13 15:59:22

+0

Luchian'cout << filelist [0] .c_str()<< endl;'给出了与'cout << filelist [0] << endl;'完全相同的结果。这使我疯狂:) – marillion 2012-07-13 16:05:26

回答

2

可能您的文本文件中仍然存在'\ n'字符(或EOF,'\ 0'),您应该尝试检查字符串是否为“干净”。

+0

这似乎是对我来说最可能的答案 - 隐藏的空白。 – Puppy 2012-07-13 16:33:46

+0

这就是问题所在!感谢您的帮助! – marillion 2012-07-13 16:57:23

0

我建议使用更多的“C++ - 杂交”的做法,虽然从张贴血的优雅的解决方案不同:

int main() 
{ 
    std::vector<std::string> fileList; 

    // ... 

    std::ifstream inputFile("filelist.txt"); 

    // ... 

    std::string line; 
    while(inputFile >> line) 
     filelist.push_back(line); 

    inputFile.close(); 

    // ... 

    for(size_t t = 0; t < filelist.size(); t++) 
    { 
     std::ifstream dataFile(filelist[t].c_str()); 

     // ... 

     dataFile.close(); 
    } 
} 
+0

刚刚尝试过这种方法,它也可以正常工作。谢谢! – marillion 2012-07-13 17:00:44

2

我也开放给任何其他方式做到这一点简单的任务。

#include <cstdlib> 
#include <iostream> 
#include <time.h> 
#include <string> 
#include <sstream> 
#include <fstream> 
#include <vector> 
#include <algorithm> 
#include <iterator> 

using namespace std; 

int main() { 

    std::ifstream inputFile("filelist.txt"); 
    std::vector<std::string> fileList; 
    std::string line; 

    if(!inputFile) { 
    std::cerr << "File list could not be opened\n"; 
    return 1; 
    } 

    while(std::getline(inputFile, line)) { 
    fileList.push_back(line); 
    } 

    std::cout << "Number of files to be analyzed: " << fileList.size() << "\n"; 

    std::vector<std::string>::const_iterator it(fileList.begin()); 
    std::vector<std::string>::const_iterator end(fileList.end()); 
    for(;it != end;++it) { 
    std::ifstream inputTxt(it->c_str()); 

    if(!inputTxt) { 
     std::cerr << "Data file could not be opened:" << *it << "\n"; 
     return 1; 
    } 
    while(std::getline(inputTxt, line)) { 
     std::cout << line << "\n"; 
    } 
    } 
} 
+0

也试过这个,它也很完美。非常感谢! – marillion 2012-07-13 17:02:57

+0

惊艳!谢谢你! – IonOne 2014-07-31 10:56:22

相关问题