1

ここに私の main() コードがあります:

#include <stdio.h>
#include <stdlib.h>
#ifdef __gnu_linux__
    #include <ncurses.h>
#endif
#ifdef _WIN32
    #include <curses.h>
#endif
#include "terminal_info.h"
#include "interface.h"
int main()
{
    initscr();
    setvbuf(stdout, NULL, _IONBF, 0);
    testForUI();
    readUIFile();
    continuouslyUpdateInfo();
    refresh();
    printDocument();
    getch();
    endwin();
    clearAll();
    return 0;
}

私が抱えている問題は次の場所で発生しprintDocument()ます:

void printDocument()
{
    int counter = 0;
    printw("Document Size: %d\n", documentSize);
    for(counter = 0; counter < documentSize; counter++)
    {
        printw("%c",(char)document[counter]);
        refresh();
    }

}

for ループの開始時に、gdb はドキュメントの内容を次のように伝えます。

$1 = (uint8_t *) 0x3e32c0 "<Root>\r\n    <Hello>World</Hello>\r\n    <This>\r\n
<Is>:-)</Is>\r\n        <An>:-O</An>\r\n        <Example>:-D</Example>\r\n    </This>\r\n</Root>\r\n««««««««_î_î_"

しかし、プログラムは以下を出力するだけです:

Document Size: 123

ただし、printw ステートメントを次のように変更すると:

printw("%c - %d",(char)document[counter], document[counter]);

私はこれを得る:

Document Size: 123

 - 13
 - 10  - 32  - 32  - 32  - 32< - 60H - 72e - 101l - 108l - 108o - 111> - 62W - 8
7o - 111r - 114l - 108d - 100< - 60/ - 47H - 72e - 101l - 108l - 108o - 111> - 6
 - 13
 - 13
 - 10    - 9< - 60I - 73s - 115> - 62: - 58- - 45) - 41< - 60/ - 47I - 73s - 115
 - 13
 - 10    - 9< - 60A - 65n - 110> - 62: - 58- - 45O - 79< - 60/ - 47A - 65n - 110
 - 13
 - 10    - 9< - 60E - 69x - 120a - 97m - 109p - 112l - 108e - 101> - 62: - 58- -
 - 13
 - 13
 - 13
 - 10

setvbuf() を使用して main() のバッファリングを無効にしようとしましたが、まったく効果がありませんでした。

役立つ場合は、次のドキュメントを読んで印刷します。

<Root>
    <Hello>World</Hello>
    <This>
    <Is>:-)</Is>
    <An>:-O</An>
    <Example>:-D</Example>
    </This>
</Root>

文書の宣言:extern uint8_t * document;

4

1 に答える 1

1

キャリッジ リターン (CR) 文字 ( \r) を削除する必要があります。

CR を出力すると、ncurses はカーソルを同じ行の最初の列にリセットします。次に NL ( \n) を出力すると、ncurses はカーソル位置から行の終わりまでを消去してから、カーソルを次の行に進めます。これにより、印刷されたばかりの行全体が効果的に削除されます。

この動作は、その価値のために文書化されています。からman waddch(強調を追加):

chがタブ、改行、またはバックスペースの場合、カーソルはウィンドウ内で適切に移動します。バックスペースは、カーソルを 1 文字左に移動します。ウィンドウの左端では何もしません。 Newline は を実行しclrtoeol、カーソルを次の行のウィンドウの左マージンに移動し、最後の行にある場合はウィンドウをスクロールします。タブは 8 列ごとにあると見なされます。タブの間隔は、TABSIZE変数を設定することで変更できます。

キャリッジ リターンへの応答は、ncurses waddch マンページの PORTABILITY セクションの最後に記載されています。

ch が改行の場合 、カーソルはウィンドウの現在の行の先頭に移動します。これは他の実装にも当てはまりますが、文書化されていません。

(PORTABILITY セクションを指摘してくれた Thomas Dickey に感謝します。)

于 2015-05-13T17:46:59.950 に答える