#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 «мой ответ, должно быть, всем остальным кажется совершенно непонятным». Я тоже так думал. Не стесняйтесь брать информацию из моих комментариев и обновлять свой ответ, чтобы сделать его менее запутанным.