проблема с открытием входного файла с помощью скрипта diff (в c ++) - PullRequest
0 голосов
/ 23 марта 2019

В моем задании меня просят сравнить выходной текстовый файл с diff.

мой код не может открыть входной файл, когда я использую оператор < (последняя строка сценария сравнения).

как мне объявить файл ввода в main? что делает последняя строка в script.sh file?

файл script.sh:

unzip A4-"$1".zip
(cd A4-"$1"/; make)
cp A4-"$1"/Scheduler.out .
echo "##### DIFF #####"
./Scheduler.out < sample.in | diff sample.out -

int main (int argc , char* argv[]){
    fstream inputFile (argv[1],fstream::in);
    fstream outputFile ("outputFile.out",fstream::out);
    /*...*/
}

1 Ответ

0 голосов
/ 23 марта 2019

Один общий шаблон для команд - либо читать из файла, представленного в качестве аргумента, либо, если аргумент отсутствует, читать из std::cin.Другой распространенной практикой для команд во многих средах является принятие - в качестве индикатора, который вы хотите прочитать из std::cin.Это может быть реализовано так:

#include <iostream>
#include <fstream>
#include <vector>

int streamer(std::istream& is) {
    std::ofstream out("outputFile.out");
    if(out) {
        /*...*/
        return 0; // if all's well
    } else
        return 1; // open failed
}

int cppmain(const std::vector<std::string>& args) {         
    if(args.size() && args[0] != "-") { // or do something cleaver to read from all "args".
        std::ifstream is(args[0]);
        if(is)
            return streamer(is);   // read from a file
        else
            return 1;              // open failed
    } else {
        return streamer(std::cin); // read from stdin
    }
}

int main(int argc, char* argv[]) {
    return cppmain({argv + 1, argv + argc});
}

Удалите часть && args[0] != "-", если вы вступаете в спор с кем-то, кому нравится называть файлы -.Я положил его туда только для показа опции.

Последняя строка:

./Scheduler.out < sample.in | diff sample.out -

Разбит:

./Scheduler.out < sample.in

Оболочка открываетсяsample.in для чтения и выполнения ./Scheduler.out.std::in в .\Schduler.out, который обычно подключается к терминалу, заменяется открытой ручкой sample.in.

... | diff sample.out -

std::cout из команды ...заменяет std::cin в diff на оболочку.- - это аргумент, который интерпретируется diff и означает, что он будет отличать один файл от входных данных, которые он получает от std::cin, очень похоже на то, что я делал в cppmain в моем примере.

...