Один общий шаблон для команд - либо читать из файла, представленного в качестве аргумента, либо, если аргумент отсутствует, читать из 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
в моем примере.