2

オーケー、以前の私のことを覚えている人もいるかもしれませんが、私はプログラミングにかなり慣れていないので、他の多くの人に匹敵するとは思えないかもしれません。しかし、現時点では、私は非常に立ち往生しています。

int main(int argc, char* argv[]) {
    string temp,input,output;//store input from file, and get which file//

    ofstream out("output.txt");

    if(argc == 3)
    {
        if(ifstream(argv[2]))
        {
            input = argv[2];
            ifstream in(input);
            while(in.good())
            {
                in >> temp;
                ReverseWord(temp);
                cout << temp << endl;
                out << temp << endl;
            }
            out.close();
            in.close();
        }
    }

}

ここにあるこのコードは、input.txt をファイル名として「revstr < input.txt」と入力することにより、ファイルから取り込んだ単語の文字順を逆にすることを意図しています。ただし、現時点では、プログラムは何も起こらず、コンソールに何も入力されずにすぐに開いたり閉じたりします。誰もこれを修正する方法を知っていますか?

4

1 に答える 1

1

関数としてプログラムを呼び出すと、(通常のプラットフォームでは) 次のように呼び出されrevstr < input.textます。main()

argv = { "revstr", NULL }
argc = 1

この場合input.txt、std::cin から読み取ることで の内容を取得します。これが「入力リダイレクト」の意味です。標準入力ストリームは、キーボード (端末) デバイスではなく、ファイルから読み取るようにリダイレクトされます。その場合、ファイル名を処理する必要はありません。

ファイル名を引数として渡すには、revstr input.txt. それはで呼び出す必要がありmain()ます

argv = { "revstr", "input.txt", NULL }
argc = 2 

そのため、ファイル名はargv[1].

前者の場合の動作は通常、'<' をリダイレクト ディレクティブ (前のコマンドを終了する) として扱うコマンド シェルが原因です。あなたは得ることを期待していたかもしれません

argv = { "revstr", "<", "input.txt", NULL }
argc = 3 

revstr "<" input.txtそのためには、シェルの動作を無効にするために何らかの形式の引用またはエスケープを適用する必要がありますrevstr \< input.txt。しかし、あなたがどこから来たのかを私が理解している限り、あなたはリダイレクトを望んでいます. その場合、argc と argv を忘れて、単純に から入力を読み取りますstd::cin

于 2013-01-26T17:38:39.513 に答える