如何使用 fwrite 将结构的字符串成员写入文件?

Posted

技术标签:

【中文标题】如何使用 fwrite 将结构的字符串成员写入文件?【英文标题】:How to write string member of structure to file using fwrite? 【发布时间】:2016-07-12 21:35:42 【问题描述】:

我有一个 c 代码,我正在使用包含 name 的结构来使用 scanf() 函数获取用户输入。每当我尝试使用 fwrite() 在文件中写入名称时,它不会写入我输入的所有字符,而只会写入几个字符(只有四个字符)。我知道问题出在 fwrite() 函数的 sizeof() 上,但我不知道应该在 sizeof() 里面写什么,所以我可以存储从用户那里得到的字符串.我知道如果使用 char name[20] 代替 char *name 它将起作用。

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>

struct Emp

  char *name;
  char *addr;
*e;

int main()

   FILE *fp;

   e=(struct Emp *)malloc(sizeof(struct Emp));
   e->name=(char *)malloc(sizeof(char )*20);

   fp=fopen("Employee.txt","r+");
   if(fp==NULL)
   
      fp=fopen("Employee.txt","w+");
      if(fp==NULL)
      
        printf("cannot open the file");
        exit(1);
      
    

      printf("Name of Employee: ");
      scanf("%s",e->name);       
      fwrite(e->name,sizeof(e->name),1,fp);


return 0;

如果我输入员工姓名:chiranjibi fwrite()函数只会在文件中写入chir。有什么办法可以让这段代码正常工作,这样我就可以从用户那里输入任意数量的字符?

【问题讨论】:

【参考方案1】:

sizeof(e->name) 返回指针的大小(通常为 4 或 8)

使用strlen(e-&gt;name) 获取字符串的长度。假设以 null 结束的字符串。

【讨论】:

非常感谢 eyalm。哦!就是这么简单。它奏效了。另一个查询 - 我使用 e->name=(char *)malloc(sizeof(char )*20) 为名称分配了内存,为什么这不起作用或可以以任何方式使用该内存分配fwrite() ? 您可以使用 strdup() 而不是 malloc 来分配字符串所需的确切字符数。不要忘记您需要释放该内存...【参考方案2】:

你可以直接把4作为第二个参数给fwrite()调用。

fwrite(e->name,4,1,fp);

因此,它只将前四个字符写入文件。如果您想根据用户输入进行更改,请声明一个变量并从用户那里获取要打印的字符数,然后将该变量作为第二个参数传递给此函数调用。

【讨论】:

是的,我也试过了。我将 100 和 200 作为第二个参数,但这会写出不寻常的字符和符号。

以上是关于如何使用 fwrite 将结构的字符串成员写入文件?的主要内容,如果未能解决你的问题,请参考以下文章

php fwrite() 没有完成将字符串数据写入文件,为啥?

如何将整数写入文件(fprintf 和 fwrite 的区别)

php: 怎么让写入的字符串自动换行(在文本里面)?用fwrite()写入

PHP中,fwrite写入文件的时候,怎么换行?

Linux 打开文件并写入一段字符串,同一时候读出相应文件的信息--fopen()/fwrite()/fread()

VC++中fwrite函数的用法是啥?