2017-08-04 125 views
-4

使用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如何工作?我应该什么时候使用它?

+0

你的程序出了什么问题取决于你在第一时间预期的输出。 –

+0

您需要声明变量类型book1,同时忘记关闭文件 –

+1

, c @ @ ,B部分(16字节)实际上是您的价格(8字节)和页面数据(8字节)。您首先需要了解C/C++如何管理数据,然后才能将文件保存到文件中 –

回答

1

没有立即错了你的程序,除非你使用gets(),这是非常错误(保证缓冲区溢出),但无关你的问题,所以我就离开这里提示:使用fgets(),以及常规信息如何可靠地获得C输入,我建议你阅读

至于你的问题,fwrite()写入无论你给它恰好它在你的计算机的内存一样的文件。您可以再次使用fread()再次读取该文件,并以相同的struct结尾。但知道数据类型的表示是实现定义。所以你不能在另一台机器上读取这个文件,或者甚至在同一台机器上使用不同编译器编译的程序。因此,使用fwrite()来编写整个struct在实践中使用非常有限。

至于为什么你看到“奇怪的东西”与cat,这仅仅是因为cat解释所有文件内容的字符。如果您只是直接写floatintstdout,而不是格式的它与printf()

要以便携的方式将struct写入文件,您必须应用某种数据序列化。一个非常简单的方法是使用fprintf()以合理的格式字符串。有很多可能性,你可以对适当的JSON库使用JSON格式,对于XML也是如此。

-2

这是正确的。 fwrite写入写入文件二进制文件,使文件中的结构占用的内存的确切副本。如果要以文本形式保存二进制成员/字段,则需要对其进行序列化,即将二进制数据转换为文本并将转换后的数据写入文件。

例如,而不是fwrite使用fprintf

fprintf(b, "%s,%f,%d\n", book1.name, book1.price, book1.pages); 
+0

因此'fwrite'用于写入二进制文件? – voldimot

+3

@voldimot一切都是二进制数据,“文本数据”只是二进制数据加上给定的数据解释 –

+1

@PeterJ我认为OP的fwrite解决方案和你的解决方案都是有效的。我们在这里所缺少的是将这样的数据存储到文件 –

相关问题