逐个读取多个文件

时间:2014-12-06 18:18:25

标签: c++ file-io

我差不多完成了我的项目,但我还有一件小事需要完成......我需要为目录中的每个文件运行整个程序。总共有大约200个文件。下面是需要运行的程序的主要类。我想我会将整个事情放在do-while循环中并运行它,直到目录中没有更多.dat文件,但我不确定这是否有效。显然,我想用变量替换硬编码的文件名......我只是不确定如何做到这一点。如果您需要澄清,请告诉我。我已经在这个项目上工作了一段时间,我有点麻木了。在此先感谢您的帮助!

编辑我的测试目录位于Windows计算机上,但它将上传到学校的Linux计算机。

  int main() {

    NearestNeighbor face;
    //string path = "C:\Users\Documents\NetBeansProjects\CSCE350";
    //string searchPattern = "*dat";
   // string fullSearchPath = path + searchPattern;


    /*TEMPLATE DATA*/

    /***********************************************************************************/
    fstream templateData;
    double data = 0.0;

    templateData.open("003_template.dat", std::ios::in);
    //check that the file is opened
    if (!templateData.is_open()) {
        std::cerr << "Template: Nooooooo!\n";
        exit(0);
    }


    /*************************************************************************************/
    //fill the templateVector with the values from templateData
    std::vector<std::vector<double> > templateVector;
    std::string line;

    while (getline(templateData, line, '\n'))
        templateVector.push_back(face.splitData(line));

    //testing the contents of the templateVector
    //  cout << "TemplateVector: ";
    //   for (unsigned i = 0u; i != templateVector.size(); ++i) {
    //           
    //    std::cout << "Index[" << i << "] ";
    //    for(double value : templateVector[i])
    //        std::cout << value << " ";
    //    std::cout << "\n";
    //  }


    /*QUERY DATA*/
    /************************************************************************************/
    std::ifstream inFile("003_AU01_query.dat", std::ios::in);
    std::vector<double> queryVector;

    double pixel = 0.0;

    // Check that the file opened
    if (!inFile.is_open()) {
        std::cerr << "Query: Nooooooo!\n";
        exit(1);
    }

    // fill the queryVector with the query data

    while (inFile >> pixel) {
        queryVector.push_back(pixel);
    }
    inFile.close();

    //   testing the content of the query vector
    //   for (unsigned i =0u; i < pixels.size(); i++){
    //       std::cout << "Index["<< i << "] " << pixels[i];
    //   }   
    //    std::cout << "\n";

    /*OUTPUT SCALAR PRODUCT*/
    /****************************************************************************************/
    vector<double> theList;
/*break out each of the vectors from the templateVector and compute the scalar product*/
    for (auto& vec : templateVector) {
        int i;
        cout << "\nscalar_product: Index[" << i << "] " << face.scalar_product(vec, queryVector);
        theList.push_back(face.scalar_product(vec, queryVector));//fill theList vector with the computations
        i++;
        std::cout << "\n";

    }
    //make sure that the sorted products are output with their original index numbers
    vector<pair<int, double> > sorted;
    sorted.reserve(theList.size());
    for(size_t i = 0.00; i != theList.size(); i++){
        sorted.push_back(make_pair(theList[i], i));
    }
   //sort the scalar products and print out the 10 closest neighbors
    face.quickSort(sorted);
    cout << "\nVector after sort:\n";
    for(size_t i = 0; i < 10; i++){
        cout << "idx: " << sorted[i].second << " " << "val: " << sorted[i].first << endl;
    }

}

2 个答案:

答案 0 :(得分:0)

bash中的解决方案:

#!/bin/bash
for file in `ls`
do
    ./program $file
done

当然,您必须修改main函数以将参数传递给fstream构造函数:

int main(int argc, char **argv)
{
    if (argc != 2)
    {
        // some error handling code
    }

    ifstream templateData(argv[1]);
    if (!templateData)
    {
        // more error handling
    }

    // process the file
}

答案 1 :(得分:0)

从您的代码中,它是Windows。

此代码将打印文件夹中的所有* .dat文件名:

而不是打印做任何你喜欢的事情。

首先,你需要包括:

#include <windows.h>

现在代码:

    const wstring dir = L"C:\\Users\\Documents\\NetBeansProjects\\CSCE350";
    const wstring ext = L"dat";  
    wstring findstr = dir;
    findstr += L"\\*.";
    findstr += ext;
    WIN32_FIND_DATA ffd;
    HANDLE hFind = FindFirstFile(findstr.c_str(),&ffd);
    do{
        if(!(ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)){
           wstring path = dir;
           path += L"\\";
           path += ffd.cFileName;
           wcout<< path<<endl;
        }
    } while (FindNextFile(hFind, &ffd) != 0);
    FindClose(hFind);

修改 在linux上你可以给你的程序一个参数路径/到/ dir / * .dat,你可以通过argv获取参数,也许是更好的解决方案。

但是如果你坚持用代码来做,那就像这样:

包括:

#include <sys/types.h>
#include <dirent.h>

现在代码:

    const string dirname = "path/to/dir";
    const string ext = ".dat";
    DIR *dir;
    struct dirent *de;
    if((dir  = opendir(dirname.c_str())) == NULL) {
       //error... check errno and so on
       cerr<<"Error..."<<endl;
    }else{
       while ((de = readdir(dir)) != NULL) {  
          //you can use stat to check if is is file or dir...
          string filename(de->d_name);
          if(ext = filename.substr(filename.size()-ext.size())){
             cout<<dirname<<"/"<<filename<<endl;
          }
       }
       closedir(dp);
    }
祝你好运