Как запустить программу на C ++ несколько раз с разными входными файлами? - PullRequest
0 голосов
/ 02 мая 2018

Я новичок в C ++ и пишу магистерскую диссертацию и буду очень признателен за любую помощь, которую я могу получить!

У меня есть программа, которая читает текстовый файл, затем выполняет кучу вычислений и возвращает новый текстовый файл. Дело в том, что я хочу запустить эту программу для более 100 различных входных файлов. Теперь мне нужно изменить имя входного файла в коде, но я бы хотел, чтобы он запускался для всех входных файлов в моей папке сам по себе.

Я использую Visual Studio, но с небольшим опытом работы с C ++.

Спасибо :)

Ответы [ 4 ]

0 голосов
/ 02 мая 2018

Вы можете попробовать использовать 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).

Другой способ - создать, например, отдельный файл, содержащий список имен всех файлов, с которыми вы хотите работать. Затем вы можете прочитать этот список и для каждого файла делать то, что вам нужно.

0 голосов
/ 02 мая 2018

Вы можете определить формат для имен ваших входных файлов и затем поместить их в какой-нибудь каталог. Например,

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(). Таким образом, файлы с некоторыми номерами могут отсутствовать. Вы просто зацикливаетесь на максимально возможном количестве идентификаторов входного файла.

Это решение, которое не требует каких-либо зависимостей. Но если вы не возражаете, вы можете рассмотреть Boost.Filesystem. Вот пример .

0 голосов
/ 02 мая 2018

Смотрите этот фрагмент. Поскольку вы используете MSCV, вам необходимо включить MFC в конфигурации для этого консольного приложения. Также добавьте #include "afx.h" в #include "stdafx.h", где определено CFileFind. 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;
}

Выход:

enter image description here

0 голосов
/ 02 мая 2018

Используя bash, вы можете запустить их, используя:

$ for file in /Data/*.txt; do /path/your_program $file; done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...