簡體   English   中英

更改標准輸出的文件位置指示器

[英]Changing the file position indicator of stdout

我試圖弄亂文件位置指示器並寫出已經在屏幕上的內容。

    #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 . . . That is a sampleThisPress any key to continue . . . 我真的很想知道為什么。 這家伙甚至在cplusplus.com上沒有回復就問同樣的問題

我知道fseek和lseek,如果它們可以工作,我可能會使用它們,但不管我想知道為什么以上都不起作用。 如果你有更好的方法,我願意接受建議,但我仍然想知道我在這里做錯了什么。 先感謝您。

當指向tty樣式設備時,Stdout沒有文件位置的概念,想想tty調制解調器的舊時代等,並且一旦發送了字符就發送它。 您可能能夠發送一系列字符以在事件之后重新定位光標並覆蓋屏幕上的文本,但是您如何執行此操作取決於輸出設備。

如果您要實現的是將輸出修改為屏幕,您可能需要查看ncurses(或類似的東西)。

或許,如果你只是想要這樣的東西(進度條顯示“part2”到目前為止完成的“總”工作量):

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

\\ r是“回車”,並將光標移回到行的開頭,而不向下移動。

如果將stdout重定向到文件,您的程序將起作用。 終端不可搜索,但磁盤文件和一些其他類型的流是可搜索的。

有一個系統調用庫調用, isatty(1) ,它得到了廣泛的支持。 如果返回true,則stdout連接到類似終端的設備,並且不可搜索。 如果錯誤,通常可以依賴它工作。 我以為有一個isapipe()調用,但我從來沒有使用它(只想到我記得在手冊頁中看到它),但我現在沒有找到它。 管道往往也不可尋找(在大多數情況下)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM