2011-12-23 37 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使用有意抽象的结构。