2016-07-10 18 views
-2

nand2tetrisコース6のプロジェクトを行っています。これは、アセンブラを作成することです。 myassembler.cppというアセンブラで、MaxL.asmというファイルを2つの異なる方法で与えると、出力が大きく異なります。ここで 、私は次の操作を実行した場合:引数として同じファイルを与えると、別の出力が得られます。

[email protected]:~/ass3/assignment3$ ./myassembler MaxL.asm >test.txt 
[email protected]:~/ass3/assignment3$ cat test.txt 
0000000000000000 
1111110000010000 
0000000000000001 
1111010011010000 
0000000000001010 
1110001100000001 
0000000000000001 
1111110000010000 
0000000000001100 
1110101010000111 
0000000000000000 
1111110000010000 
0000000000000010 
1110001100001000 
0000000000001110 
1110101010000111 

出力が正しいこと、そしてこれは私が欲しいものです。しかし、私が次のようにすれば、

[email protected]:~/ass3/assignment3$ ./myassembler <MaxL.asm>test.txt 
[email protected]:~/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

+2

@sam私の水晶玉のように、おそらく何かが、人々は間違いなくその「今日だけ」の約束にあなたを保持しようとしていることを示して、あなたは後悔することになります。 –

+0

私は明日を待つことができません!コミュニティ全体が私のために私の仕事をするつもりです。私は非常に有用だったビデオゲーム –

+0

を再生します。私自身のバグを修正することは非常にエキサイティングであり、うまくいきました。ありがとう – tuxebin

答えて

2

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

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

つまり、argv[argc - 1]を使用すると、実行可能プログラムであるargv[0]が使用されています。

argvアレイを使用する前に、argc1より大きいかどうかをチェックする必要があります。

argc1の場合は、代わりに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"; 
    } 
} 
+0

そして、彼はファイルを2回開く必要はありません。ファイル名をコンストラクタに渡すと、すでにファイルが開かれます。この後、彼は「開かれた」と呼ぶ必要はない。 – JojOatXGME

+0

私は何が間違っているのか理解しました。おかげさまで。あなたのフォーマットは使用しませんでしたが、問題を解決できました。どうもありがとうございました – tuxebin

関連する問題