使用大于size_t的值可以用fwrite表示

时间:2013-08-05 22:22:26

标签: c file-io fwrite

我知道fwrite采用以下参数:

fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );

据我所知,size_t是一个typedef,而不是:

typedef unsigned long size_t;

是否可以使用大于size_t的值进行计数和写入? 如果不是,我可以以某种方式连接写入的块吗?

4 个答案:

答案 0 :(得分:2)

不,fwrite仅接受适合size_t类型的值。

可能有特定于实现的方式来编写更多,但对于标准C,该方法通常只是进行顺序fwrite调用。每个后续调用都将附加到您已经写过的内容中。

请记住,size_t是一种独特的类型。它可能被定义为unsigned long是一些实现,但不能保证。

答案 1 :(得分:1)

为了使用fwrite,您正在编写的整个对象必须位于ptr指向的对象中。除非你有一个非常混乱的C实现,否则不可能有一个大于size_t的最大值的对象,所以尝试写入比这更多的字节将是一个编程错误,因为指向的对象是实际上并不是那么大。

答案 2 :(得分:1)

从应用程序员的角度来看,文件是一系列连续的字节。连续写入将数据按顺序放置到文件上。 (此评论是必要的,因为有些人会争论与您的问题无关的细节。)

因此:

fwrite(&user_record1, sizeof(user_record1), 1, fp);
fwrite(&user_record2, sizeof(user_record2), 1, fp);

在文件中生成两个用户记录,一个紧接着另一个用户记录。

如果你有一个非常大的记录,那么将它分成两个较小的记录,如:

fwrite(&user_record_parta, sizeof(user_record1), 1, fp);
fwrite(&user_record_partb, sizeof(user_record2), 1, fp);

但是,我会质疑使用这种大型记录的应用程序设计。也许你在应用程序中真正做的是编写一组用户记录,并且该数组的增长非常大。如果是这种情况,请编写数组的每个条目,而不是整个数组。

答案 3 :(得分:0)

如果使用的值大于ULONG_MAX,则它将回绕到0.

你可以做的是写ULONG_MAX字节,寻找最终位置并继续写,然后循环完成,直到你写完所有数据。