【问题标题】:Where and how to use fwrite function in c在哪里以及如何在c中使用fwrite函数
【发布时间】:2017-08-04 10:32:36
【问题描述】:

我只是无法理解 fwrite 函数在 c 中是如何工作的。我已经制作了一个 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 是如何工作的?我应该什么时候使用它?

【问题讨论】:

  • 你的程序有什么问题取决于你最初期望的输出。
  • 你需要声明变量类型book1,你也忘了关闭文件
  • 嗯,����c����@�@��,B 部分(16 字节)实际上是您的价格(8 字节)和页面数据(8 字节)。在开始将内容保存到文件之前,您首先需要了解 C/C++ 如何管理数据
  • 使用fprintf而不是fwrite如果你想以文本形式写入文件。
  • 使用fwrite/fread时,最好以binary方式打开文件。

标签: c structure fwrite


【解决方案1】:

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

至于您的问题,fwrite() 将您提供的任何内容写入文件,其方式与您在计算机内存中的方式完全相同。您可以使用fread() 再次读取相同的文件,并以相同的struct 结束。但是注意数据类型的表示是实现定义的。因此,例如,您无法在不同的机器上读取此文件,甚至无法在同一台机器上使用不同的编译器编译的程序。因此,用fwrite()写整个structs在实践中的用途非常有限。

至于为什么你在cat 中看到“strange stuff”,这仅仅是因为cat 将所有文件内容解释为字符。如果您直接将floatint 写入stdout,而不是使用printf() 格式化,您会看到相同的结果。

要以可移植方式将structs 写入文件,您必须应用某种数据序列化。一种非常简单的方法是将fprintf() 与合理的格式字符串一起使用。有很多可能性可以做到这一点,你可以例如使用带有适当 JSON 库的 JSON 格式,XML 也是如此。

【讨论】:

    【解决方案2】:

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

    例如,而不是 fwrite 使用 fprintf

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

    【讨论】:

    • 所以fwrite是用来写二进制的??
    • @voldimot 一切都是二进制数据,“文本数据”只是二进制数据加上对此类数据的给定解释
    • @PeterJ 我认为 OP 的 fwrite 解决方案和您的解决方案都是有效的。我们在这里缺少的是将此类数据存储到文件中的格式
    • @Gianluca Ghettini 这不是关于有效性,而是关于这个想法。 OPs 文件名具有 .txt 扩展名 - 这通常意味着:文本。文本意味着 - 人类可读的内容
    • @voldimot 大致是的。 fwrite 用于逐字写入内存内容(通常称为二进制数据),fprintf 用于生成数据的“字符串”表示形式(通常称为文本)。但 Gianluca 是对的,在计算机世界中,一切最终都是二进制的。
    猜你喜欢
    • 1970-01-01
    • 2020-08-30
    • 2021-09-01
    • 1970-01-01
    • 2016-09-24
    • 2013-01-29
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多