我知道fwrite
采用以下参数:
fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
据我所知,size_t
是一个typedef,而不是:
typedef unsigned long size_t;
是否可以使用大于size_t
的值进行计数和写入?
如果不是,我可以以某种方式连接写入的块吗?
答案 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
字节,寻找最终位置并继续写,然后循环完成,直到你写完所有数据。