2012-12-23 35 views
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當作一個文件來處理。出於某種原因,我得到這個作爲輸出:That is a sampleThisPress any key to continue . . .我真的想知道爲什麼。 This guy甚至提出了同樣的問題上沒有迴應cplusplus.com

我知道fseek和lseek,我可能會使用這些,而不是他們的工作,但無論我想知道爲什麼上述不起作用。如果你有更好的方式做到這一點,我願意提供建議,但我仍然想知道我在這裏做錯了什麼。先謝謝你。

回答

2

當指向tty風格的設備時,Stdout沒有文件位置的概念,想想tty調制解調器的舊時代等等,一旦發送了一個字符,它就被髮送出去。您可以在事件發生後重新發送字符序列以重新定位光標,並覆蓋屏幕上的文本,但是您如何做到這一點取決於輸出設備。

+0

真的只適用於特定類型的輸出設備/終端。我曾經寫過代碼,做了類似的事情說一個後來成爲ANSI標準的VT100終端(http://en.wikipedia.org/wiki/VT100),所以它仍然可能是一個很酷的項目,只是會嚴重依賴於系統 – PeterJ

+0

@R eallyBadAtStuff:不要在文本模式下重寫屏幕。相反,請參閱[curses](http://linux.die.net/man/3/ncurses)(現稱爲ncurses),以獲取終端類型的獨立方式。 – wallyk

+0

正如wallyk所說,curses是在Linux上執行它的標準方法,如果你使用的話。 – PeterJ

0

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

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

+0

好的,謝謝。 – UniqueUsername

2

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

或許,如果你只是想這樣的事情(一個進度條,顯示多少「第2部分是‘全面’是迄今所做的工作):

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

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