3

ファイル位置インジケーターをいじって、すでに画面に表示されているものを上書きしようとしています。

    #include <stdio.h>

    int main ()
    {
       fpos_t position;


       fgetpos (stdout, &position);
       fputs ("That is a sample",stdout);
       fsetpos (stdout, &position);
       fputs ("This",stdout);

       return 0;
    }

これは「サンプルです」が欲しいです。私はcplusplus.comからすぐに同様のコードを取得しましたが、唯一の違いは、stdoutではなく実際のファイルを使用することです。私が知らないstdoutに特別な例外はありますか?

stdoutをファイルのように扱うことができると思いました。どういうわけか私はこれを出力として得ています:That is a sampleThisPress any key to continue . . . 私は本当に理由を知りたいです。 この男はcplusplus.comで応答なしで同じ質問をしました

私はfseekとlseekについて知っており、それらが機能する場合は代わりにそれらを使用する可能性がありますが、上記が機能しない理由を知りたいのですが。あなたがこれを行うためのより良い方法を持っているなら、私は提案を受け入れますが、それでも私がここで間違っていることを知りたいです。前もって感謝します。

4

3 に答える 3

3

達成しようとしているのが画面への出力を変更することである場合は、ncurses(または同様のもの)を確認することをお勧めします。

または、このようなものが必要な場合(これまでに行われた「合計」作業の「part2」がどれだけあるかを示すプログレスバー):

....
cout << part * 100 / total << "% done\r"; cout.flush();
....

\ rは「キャリッジリターン」であり、下に移動せずにカーソルを行の先頭に戻します。

于 2012-12-23T11:05:52.547 に答える
2

Stdoutには、ttyスタイルのデバイスを指すときのファイル位置の概念がなく、ttyモデムなどの昔のことを考えて、文字が送信されると送信されます。一連の文字を送信して、イベント後にカーソルを再配置し、画面上のテキストを上書きできる場合がありますが、その方法は出力デバイスによって異なります。

于 2012-12-23T07:39:32.453 に答える
1

stdoutがファイルにリダイレクトされる場合、プログラムは機能します。ターミナルはシーク可能ではありませんが、ディスクファイルやその他の種類のストリームはシーク可能です。

isatty(1)広くサポートされているシステムコールライブラリコールがあります。trueを返す場合stdout、端末のようなデバイスに接続されており、シークできません。falseの場合、通常はそれが機能していることに依存できます。電話があったと思ったのですが、isapipe()使ったことがありません(manページで見たのを覚えているだけです)が、今はどこにも見つかりません。パイプもシークできない傾向があります(ほとんどの場合)。

于 2012-12-23T07:47:24.217 に答える