C语言 结构体指针字符 二进制文件写入和读取

typedef struct s{
char *name;
}student;

/*将结构体读出并显示*/
int IsUsed(char *str)
{
FILE *fp = fopen("test","rb");
student s;
s.name = (char*) malloc(sizeof(char)*20);
fread(&s,sizeof(student),1,fp);
while(!feof(fp)){
printf("%s",s.name); //为什么这里出错??????????????????
if(strcmp(s.name,str)==0){
fclose(fp);
return 1; //存在该字符串,则返回1
}
fread(&s,sizeof(student),1,fp);
}
fclose(fp);
return 0; //不存在该字符串,则返回0
}
int main()
{
FILE *fp = fopen("test","rb+");
/*先将结构体P存入二进制文件中*/
student p;
p.name = (char*) malloc(sizeof(char)*20);
scanf("%s",p.name);
while(IsUsed(p.name)){ //检查员工号是否唯一
printf("该字符串已经存在,请更换一个:");
scanf("%s",p.name);
}
fwrite(&p,sizeof(student),1,fp);
}

当然不对了,你的结构体成员,是一个指针
sizeof(student) ,win32是4字节,win64是8字节
当读入其中4个或8个字节时,它指向的指针地址并不一定存在

你可以定义为一个字符数组
温馨提示:内容为网友见解,仅供参考
第1个回答  2014-02-22
fread写错了,你试试fread(p.name, 20, fp)追问

p.name不行啊、我就是按照结构体存的文件、如果机构体有多个元素,肯定就不ok了、

追答

哦,你malloc了以后没有memset,先memset然后再fread改成s.name试试。

第2个回答  推荐于2016-08-25
打开方式用二进制方式打开,如 FILE *fp = fopen("a.zip","rb+");然后读用fread去读。
1、对于程序来说,不管后缀名如何,文件分为两种类型:文本文件和二进制文件。
2、C语言里有一系列文件操作函数。区分文本和二进制文件,需要在打开文件时设置不同的控制符mode的变量即可。
fopen的函数原型:FILE * fopen(const char * path,const char * mode);
fopen函数的第一个参数是文件路径,第二个参数是打开方式,有以下几种方式:
  r 以只读方式打开文件,该文件必须存在。
  r+ 以可读写方式打开文件,该文件必须存在。
  rb+ 读写打开一个二进制文件,允许读数据。
  rw+ 读写打开一个文本文件,允许读和写。
  w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
  w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
  a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
  a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留)
  wb 只写打开或新建一个二进制文件;只允许写数据。
  wb+ 读写打开或建立一个二进制文件,允许读和写。
  wt+ 读写打开或着建立一个文本文件;允许读写。
  at+ 读写打开一个文本文件,允许读或在文本末追加数据。
  ab+ 读写打开一个二进制文件,允许读或在文件末追加数据。
  上述的形态字符串都可以再加一个b字符,如rb、w+b或ab+等组合,加入b 字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件。

c语言中怎么把一个结构体数组写入文件
1、以二进制读方式(rb)打开文件 2、调用读文件函数fread()读取文件中的数据到结构体变量 3、关闭文件指针 参考代码如下:include<stdio.h>struct stu {char name[30];int age;double score;};int read_file();int write_file();int main(){if ( write_file() < 0 ) \/\/将结构体数据写入...

C语言文件读写结构体里面的数据怎样存到磁盘文件上
需要注意一点,当结构体中有指针类型时,所有指针不可以直接写入,而是要依照每个指针展开写入,即写入指针指向的地址内容,而不是写入指针本身的值。这种情况下,读取的时候也需要重新分配指针,并读取对应的数据。2 以文本方式写入。通过fprintf函数,对每个值以可读的方式,格式化输出到文本文件中。类似于p...

C语言读写二进制文件与数据类型有什么关系?
不管是文本文件还是二进制,最终存到硬盘中都是二进制的,只不过在读的时候处理不一样,比如已写入一个字符串,那就得已字符串进行处理,如果写入的是一个int,或者double,就用int或者double类型处理。

在C语言中文件有几种操作类型
主要是两种文件类型:1)文本文件,2)二进制文件。一般来说,人类可读的文件都作为文本文件,例如一片文章。其余都作为二进制文件,例如一个程序。在C语言中,文件的操作是通过FILE结构体进行了,利用fopen返回一个指向FILE结构体的指针,在使用fopen函数过程中,使用mode控制符对是否打开哪类文件进行控制:...

C语言教程第8天,读写文件
对于大文件或二进制文件的读取,可以使用fread,它以更精确的字节为单位进行读取。写入文件则常用fprintf、fwrite和fputs,如:int fprintf(FILE *stream, const char *format, ...);和 size_t fwrite(const void *restrict ptr, size_t size, size_t count, FILE *restrict stream);最后,结构化数...

2018年计算机二级考试《C语言》考点:文件
2018年计算机二级考试《C语言》考点:文件 【考点1】文件类型指针 文件指针是一个指向结构体类型的指针,定义格式为:FILE *指针变量名。在使用文件时,都需要先定义文件指针。【考点2】文本文件与二进制文件 文本形式存放的是字符的ASCII码,二进制形式存放的是数据的二进制。例如“100”如果是文本形式就...

C语言详解 FILE文件操作
读取字符串使用fgets()函数,从文件读入指定字符数量的字符串,读取结束位置添加'\\0',用于字符串结束标记。写入字符串使用fputs()函数,将字符串输出至指定文件。读写数据块使用fread()和fwrite()函数,一次读写一组数据,适用于数组、结构体等。二进制文件操作以数据块形式进行读写,使用fread()和...

c语言可以处理的文件类型是
c语言可以处理的文件类型是文本文件和二进制文件。在C语言中,文件的操作是通过FILE结构体进行了,利用fopen返回一个指向FILE结构体的指针,在使用fopen函数过程中,使用mode控制符对是否打开哪类文件进行控制。C语言是一门面向过程的计算机编程语言,与C++、Java等面向对象编程语言有所不同。C语言的设计目标...

C语言 从一个二进制文件里读取一个结构体时出现如图的显示(我先前已经...
1、程序出现死循环了,文件运行成功了,但是所有属性都是0或者空,检查一下是不是再写循环代码的时候那个值的属性或者条件写错了,导致出现了死循环;2、看一下主键是不是调用数据里面填写正确,或者在带入的时候是不是单次书写正确,C语言需要区分大小写,如果不区分大小写系统不识别;3、程序使用调用...

c语言如何创建文件并将结构体数据存进去
c语言如何创建文件并将结构体数据存进去?需要使用文件操作函数fwrite和fread。 读物文件并写入结构体,同时保存文件的代码如下:1、写 FILE* fp = fopen("card.dat

相似回答