用差异脚本打开输入文件的问题(在C ++中)

时间:2019-03-23 11:34:27

标签: c++ makefile diff execute

在我的作业中,我被要求将输出文本文件与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 :(得分:0)

一种常见的命令模式是从作为参数提供的文件中读取,或者在缺少参数时从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

shell打开sample.in进行读取并执行./Scheduler.outstd::in中的.\Schduler.out(通常连接到终端)由打开的sample.in句柄代替。

... | diff sample.out -

命令std::cout中的

...被shell替换了std::cin中的diff-是一个由diff解释的参数,意味着它将使用从std::cin获得的输入来比较一个文件,就像我在cppmain中所做的一样我的例子。