在哪里以及如何在C
使用fwrite的功能我不能understasnd finction如何FWRITE在CI工作做了交流program.here其它: -在哪里以及如何在C
#include <stdio.h>
int main()
{
struct books
{
char name[100];
float price;
int pages;
}book1;
puts("enter the name of the book");gets(book1.name);
puts("enter the price of the book");scanf("%f",&book1.price);
puts("enter the pages of the book");scanf("%d",&book1.pages);
FILE *b=fopen("Book.txt","w");
fwrite(&book1,sizeof(book1),1,b);
}
这里是个节目的输入: -
$ ./a.out
enter the name of the book
Voldemort the last BSD user
enter the price of the book
40000
enter the pages of the book
34
,这里是该文件的内容: -
$ cat Book.txt
Voldemort the Great Linux and bsd user!����c����@�@��,B
因此,什么是错在我的计划? fwrite如何工作?我应该什么时候使用它?
没有立即错了你的程序,除非你使用gets()
,这是非常错误(保证缓冲区溢出),但无关你的问题,所以我就离开这里提示:使用fgets()
,以及常规信息如何可靠地获得C输入,我建议你阅读
至于你的问题,fwrite()
写入无论你给它恰好它在你的计算机的内存一样的文件。您可以再次使用fread()
再次读取该文件,并以相同的struct
结尾。但知道数据类型的表示是实现定义。所以你不能在另一台机器上读取这个文件,或者甚至在同一台机器上使用不同编译器编译的程序。因此,使用fwrite()
来编写整个struct
在实践中使用非常有限。
至于为什么你看到“奇怪的东西”与cat
,这仅仅是因为cat
解释所有文件内容的字符。如果您只是直接写float
和int
至stdout
,而不是格式的它与printf()
。
要以便携的方式将struct
写入文件,您必须应用某种数据序列化。一个非常简单的方法是使用fprintf()
以合理的格式字符串。有很多可能性,你可以对适当的JSON库使用JSON格式,对于XML也是如此。
这是正确的。 fwrite写入写入文件二进制文件,使文件中的结构占用的内存的确切副本。如果要以文本形式保存二进制成员/字段,则需要对其进行序列化,即将二进制数据转换为文本并将转换后的数据写入文件。
例如,而不是fwrite
使用fprintf
fprintf(b, "%s,%f,%d\n", book1.name, book1.price, book1.pages);
因此'fwrite'用于写入二进制文件? – voldimot
@voldimot一切都是二进制数据,“文本数据”只是二进制数据加上给定的数据解释 –
@PeterJ我认为OP的fwrite解决方案和你的解决方案都是有效的。我们在这里所缺少的是将这样的数据存储到文件 –
你的程序出了什么问题取决于你在第一时间预期的输出。 –
您需要声明变量类型book1,同时忘记关闭文件 –
, c @ @ ,B部分(16字节)实际上是您的价格(8字节)和页面数据(8字节)。您首先需要了解C/C++如何管理数据,然后才能将文件保存到文件中 –