проблема с открытием входного файла с помощью diff script (на c )

#c #makefile #diff #execute

#c #makefile #разница #выполнить

Вопрос:

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

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

как я должен объявить inputfile в 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. Вы должны были написать ./Scheduler.out sample.in | diff sample.out - , argv[1] тогда бы содержали "sample.in" .

2. «как я должен объявить inputfile в main?» В случае использования < содержимое sample.in перенаправляется на std::cin вашу программу. Вероятно, вам следует прочитать о средствах перенаправления ввода / вывода вашей оболочки .

3. Я не могу изменить файл сценария. это из-за автоматической проверки

4. «Я не могу изменить файл сценария». Затем прочитайте входные данные из std::cin вместо явного открытия файла.

Ответ №1:

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

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

int streamer(std::istreamamp; 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>amp; args) {         
    if(args.size() amp;amp; 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});
}
  

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

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

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

Сбой:

./Scheduler.out < sample.in

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

... | diff sample.out -

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

Комментарии:

1. то есть не имеет значения, как я назову выходной файл fstream (текстовый файл)?

2. Это имеет значение, только если у вас есть контракт. Если вы контролируете обе стороны, нет, это не имеет значения.

3. Я изменил его на:fstream outputFile («output.out»,fstream::out); . но он по-прежнему ничего не записывает в файл (кажется, что он запускает код, но ничего не может в него записать)

4. Если ваши изменения в коде изменяют исходный вопрос, обновите вопрос.

5. @TedLyngmo «мой ответ, должно быть, всем остальным кажется совершенно непонятным». Я тоже так думал. Не стесняйтесь брать информацию из моих комментариев и обновлять свой ответ, чтобы сделать его менее запутанным.