2011-12-23 48 views
4

我與使用位運算與文件長度的函數工作:fpos_t flen;演員fpos_t爲int或燒焦

當我嘗試它轉換成一整型或字符,或試圖在算術運算就可以了它會因以下編譯錯誤而失敗: error: aggregate value used where an integer was expected

+1

'fpos_t'是一個結構體,而不是數字,參見[here](http://dsmarkchen.blogspot.com/2008/08/fpost.html) – 2011-12-23 22:52:22

+0

@SethCarnegie它是?我正在處理其他的代碼。現在我不太確定我在做什麼......如果你知道結構的成員,把它們作爲答案。 – sj755 2011-12-23 22:55:30

+0

fpos_t的類型是實現定義的 - 沒有記錄。它因平臺而異。你可以用'fgetpos()'得到一個值,然後用'fsetpos()'來使用這個值,這就是全部;其他一切都沒有秩序。 ([POSIX](http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/stdio.h.html#tag_13_49)頁面,迴應定義'fpos_t'的C標準,說:_'fpos_t':A非數組類型,包含指定文件中每個位置唯一所需的全部信息。) – 2011-12-23 22:58:33

回答

5

您正在濫用該類型。首先,它不代表一個長度。它代表的位置。其次,它僅用於撥打fsetpos。你不打算對它做算術,因爲它不一定代表數字類型。它包含您的圖書館需要能夠執行fsetpos操作的任何信息。在你的庫的實現中,fpos_t看起來像一個聚合類型,比如一個結構。 (您可以在頭文件中檢查清晰度,但不要依賴於您在那裏發現的任何內容;在其他平臺或標準庫的未來版本中,它們可能會有所不同。)

至於您的下一個當考慮到在fpos_t上進行按位操作的想法時,考慮詢問一個更直接的問題,即如何解決您正在處理的任何問題。

+0

我經歷了gdb。在Linux(Fedora 15)中,有一個稱爲__pos的成員變量,似乎保存了長度。我想也許作者原來是這樣做的。 – sj755 2011-12-23 23:09:29

+1

也許吧。但是,不能保證'__pos'成員意味着你或其他作者認爲它的意思。 – 2011-12-24 00:52:43

+2

我問誰給了我代碼的人。他說,幾年前他在Solaris下編譯得很好。我在VMWare上安裝了Solaris 11,編譯了該程序,並發現fpos_t是一個整數類型。換句話說,Solaris上的fpos_t與Linux上的fpos_t .__ pos是一樣的。我已經改變了代碼,編譯了代碼,並發現它可以正常工作。 – sj755 2011-12-24 05:16:15

0

這聽起來像您想要將當前文件位置作爲整數使用。如果是這樣,你可能會想使用ftell/fseek(或他們的64位同胞),而不是fgetpos/fsetpos。兩者都提供類似的操作,但ftell/fseek使用整數值,而fgetpos/fsetpos使用有意抽象的結構。