-1

アセンブラを作成する nand2tetris コースのプロジェクト 6 を実行しています。myassemblyr.cpp という私のアセンブラで、MaxL.asm というファイルを 2 つの異なる方法で指定すると、出力は大きく異なります。ここで、次のようにすると:

ebin@tux:~/ass3/assignment3$ ./myassembler  MaxL.asm >test.txt
ebin@tux:~/ass3/assignment3$ cat test.txt
0000000000000000
1111110000010000
0000000000000001
1111010011010000
0000000000001010
1110001100000001
0000000000000001
1111110000010000
0000000000001100
1110101010000111
0000000000000000
1111110000010000
0000000000000010
1110001100001000
0000000000001110
1110101010000111

出力は正しく、これが私が望むものです。ただし、次のようにすると、

ebin@tux:~/ass3/assignment3$ ./myassembler < MaxL.asm >test.txt
ebin@tux:~/ass3/assignment3$ cat test.txt
1110001100000000
111000000
111000000
111000000
1110101010000000
1110101010000000
1110101010000000
1110101010000000
1110101010000000
1110110000000000
111000000
1110101010000000
111000000
1110101010000000
111000000
111000000
111000000
1110101010000000
1110101010000000
111111000
111000000
1110101010000000
111000000
111000000
111000000
111000000
111000000
111000000
1110101010000000
1110110000000000
1110110000000000
1110110000000000
1110110000000000
1110110000000000
1110110000000000
1110110000000000
1110110000000000
1110101010000000
1110101010000000
111000000
111000000
1110001100000000
111000000
111000000
111000000
1110001100000000
111000000
111000000
111000000
1110111010000000
1110001100000000
1110101010000000
111000000
1110111111000000
1110101010000000
1110101010000000
1110111111000000
1110101010000000
1110101010000000

出力が間違っています。これを送信するには、2 番目の方法で機能する必要があります。ファイル名の前に<を付けると何が悪いのかわかりません。

ファイルを読み取るコードスニペットは次のとおりです

ifstream fin(argv[argc-1]);
fin.open(argv[argc-1]);

入力の仕方で何が問題になっていますか? 修正方法は?TIY

4

1 に答える 1

2

<入力リダイレクト文字であり、プログラムではなくシェルによって処理されます。

2 回目の呼び出しで引数を確認すると、引数がないことがわかります。

つまり、実行可能プログラムargv[argc - 1]を使用していることを意味します。argv[0]

が配列を使用する前argcよりも大きいかどうかを確認する必要があります。1argv

argcが等しい場合は、代わりに1から読み取る必要があります。std::cinこれは、実際のすべてのコードを別の関数に入れ、ストリームを (参照によって) それに渡すと非常に簡単です。おそらく次のようなもの

void function_that_does_actual_work(std::istream& in)
{
    // Do lots of useful and important stuff...
}

int main(int argc, char* argv[])
{
    if (argc == 2)
    {
        std::ifstream file(argv[1]);
        function_that_does_actual_work(file);
    }
    else if (argc == 1)
    {
        function_that_does_actual_work(std::cin);
    }
    else
    {
        std::cout << "No file provided\n";
    }
}
于 2016-07-10T15:38:32.883 に答える