【问题标题】:How to run a c++ program multiple times with different input files?如何使用不同的输入文件多次运行 c++ 程序?
【发布时间】:2018-05-02 16:43:30
【问题描述】:

我是 C++ 新手,正在撰写我的硕士论文,如果能得到任何帮助,我将不胜感激!

我有一个程序读取一个 txt 文件,然后进行一堆计算,并返回一个新的 txt 文件。问题是我想为 100 多个不同的输入文件运行这个程序。现在我必须更改代码中输入文件的名称,但我想让它自己为我文件夹中的所有输入文件运行。

我正在使用 Visual Studio,但几乎没有 C++ 经验。

谢谢:)

【问题讨论】:

  • A) 让您的程序将目录作为参数并处理该目录中的所有文件。 B) 编写一个批处理文件。
  • 您使用什么样的操作系统?如果是 Linux,制作一个 shell 脚本
  • C) 让你的程序接受多个文件名参数并依次处理它们。
  • FirstFirst / FindNext() 在当前目录中,或者让您的程序读取一个文本文件,其中包含您要处理的所有文件的列表。这样就不用每次都重新编译了。
  • D) 将文件名放入文件中,并让程序读取 that

标签: c++ file input


【解决方案1】:

看到这个sn-p。由于您使用的是 MSCV,因此您需要在此控制台应用程序的配置中启用 MFC。还要在定义CFileFind#include "stdafx.h" 中添加#include "afx.h"PopulateFromFolder() 应该自动将文件加载到向量files

#include "stdafx.h"
#include <iostream>
#include <string>
#include <fstream>
#include <vector>   

using namespace std;

void PopulateFromFolder(string path, vector<string>& files)
{
    CFileFind   finder;
    CString fileName;
    fileName.Format(L"%s*.*", CString(path.c_str()));
    BOOL bOk = finder.FindFile(fileName);
    while (bOk)
    {
        bOk = finder.FindNextFile();

        if (finder.IsDots())
        {
            continue;
        }
        if (!finder.IsDirectory())
        {
            CString strFileName = finder.GetFileName();
            files.push_back(CStringA(strFileName).GetString());
        }
    }
    finder.Close();
}

int main()
{
    vector<string> files;
    string path = "D:\\MyFolder\\";
    PopulateFromFolder(path, files);

    auto a = path + files[0];
    int i = 0;
    while (i< files.size()-1)
    {
        cout << "processing " << files[i + 1] << endl;
        ifstream fs(path+files[i++]);
        if (fs.is_open())
        {
            //do something
        }
        fs.close();
    }
    return 0;
}

输出:

【讨论】:

    【解决方案2】:

    使用 bash 你可以运行它们:

    $ for file in /Data/*.txt; do /path/your_program $file; done
    

    【讨论】:

      【解决方案3】:

      您可以为输入文件名定义格式,然后将其放入某个目录。例如,

      Input1.txt
      Input2.txt
      ...
      Input111.txt
      

      然后使用某种for 循环:

      for(int i = 1; i <= 111; ++i)
      {
          ifstream file("Input" + std::to_string(i) + ".txt");
          if (file.is_open())
              Operate(file);
      }
      

      如果不知道具体文件个数,可以通过is_open()方法查看文件是否被打开。这样可以不存在带有一些数字的文件。您只需循环获取最大可能的输入文件 ID。

      这是一个不需要任何依赖项的解决方案。但是如果你不介意的话,你实际上可以考虑 Boost.Filesystem。这是example

      【讨论】:

        【解决方案4】:

        您可以尝试使用std::experimental::filesystem (http://en.cppreference.com/w/cpp/experimental/fs)。我猜这个库中的directory_iterator 对你很有用——它允许你遍历给定目录中的所有文件。查看文档中提供的示例:http://en.cppreference.com/w/cpp/experimental/fs/directory_iterator。 但是,您必须确保使用新标准 (C++ 17) 编译代码。

        另一种方法是制作一个单独的文件,其中包含您要处理的所有文件的名称列表。然后,您可以阅读此列表并为每个文件执行您需要的操作。

        【讨论】:

        • 使用std::experimental::filesystem实际上意味着使用C++17。现在只是std::filesystem
        猜你喜欢
        • 1970-01-01
        • 2020-11-13
        • 1970-01-01
        • 1970-01-01
        • 2021-10-17
        • 1970-01-01
        • 1970-01-01
        • 2015-08-08
        • 2014-10-09
        相关资源
        最近更新 更多