1

我知道这fwrite需要以下参数:

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

据我所知,size_t是一个 typedef,仅此而已:

typedef unsigned long size_t;

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

4

4 回答 4

2

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

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

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

于 2013-08-05T22:28:36.900 回答
1

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

于 2013-08-05T22:29:38.623 回答
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);

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

于 2013-08-05T22:43:15.007 回答
0

如果你使用比它更大的值,ULONG_MAX它只会环绕到 0。

您可以做的是写入ULONG_MAX字节,寻找结束位置并继续写入,然后循环执行,直到您写入所有数据。

于 2013-08-05T22:28:07.003 回答