C语言 fwrite函数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言 fwrite函数相关的知识,希望对你有一定的参考价值。
从键盘输入3位教师的信息,并将他们存放到teacher.dat中
#include "stdafx.h"
#include "stdio.h"
#include "process.h"
int main(int argc, char* argv[])
FILE *fp;
int i;
struct teacher
long num;
char name[20];
int age;
float salary;
tea[3];
for(i=0;i<3;i++)
scanf("%1d,%s,%d,%f",&tea[i].num,tea[i].name,&tea[i].age,&tea[i].salary);
fp=fopen("D:\\teacher.txt","wb");
if(fp==NULL)
printf("Can not open the file\n");
exit(0);
else
for(i=0;i<3;i++)
fwrite(&tea[i],sizeof(struct teacher),1,fp);
fclose(fp);
编译没错,运行的时候有错,出现很多烫
scanf("%1d,%s,%d,%f",&tea[i].num,tea[i].name,&tea[i].age,&tea[i].salary);中的
&tea[i].num
tea[i].name
&tea[i].age
&tea[i].salary
分别是什么?为什么tea[i].name前面没有&?
fwrite(&tea[i],sizeof(struct teacher),1,fp);中的
&tea[i]
sizeof(struct teacher)
分别是什么?
scanf("%1d,%s,%d,%f",&tea[i].num,tea[i].name,&tea[i].age,&tea[i].salary);
可以换成
scanf("%1d,%s,%d,%f",&num,name,&age,salary);吗?
把fwrite(&tea[i],sizeof(struct teacher),1,fp);换成
fwrite(&tea[3],sizeof(struct teacher),1,fp);
编译成功,但是文本内容是乱码,为什么?
在控制台输入 1,aaa,24,3000回车。
scanf的第一个参数是格式化字符串,后面是可变长参数列表,要求是指针类型,tea[i].name代表tea数组的第i个元素中的name,name会从char[]类型隐式转型为char *,也就是字符数组首地址。
所以不需要取地址&。
fwrite是向文件中写入你之前输入的内容,该内容是二进制的,因为你打开的时候是用的wb,w是写的意思,b是binary的意思。你向文件中写入了这个结构体二进制数据。&tea[i]就是tea[i]的地址,sizeof(struct teacher)返回结构体teacher的大小。追问
scanf("%1d,%s,%d,%f",&tea[i].num,tea[i].name,&tea[i].age,&tea[i].salary);
可以换成
scanf("%1d,%s,%d,%f",&num,name,&age,salary);吗?
不可以。tea[i]是一个teacher对象。你这样写必须要先定义num,name,age,salary这四个变量,然后还要将其拷贝到tea[i]中。
像这样。
int num;char name[20];int age;float salary;
scanf("%1d,%s,%d,%f" , &num , name , &age , &salary);
tea[i].num = num;
strcpy(tea[i].name , name);
tea[i].age = age;
tea[i].salary = salary;
&tea[i].num ////自定义的结构体变量意思可以自己定 大概是学号的意思
tea[i].name //// 自定义的结构体变量意思可以自己定 大概是名字的意思
&tea[i].age ////自定义的结构体变量意思可以自己定 大概是年龄的意思
&tea[i].salary /////自定义的结构体变量意思可以自己定
为什么tea[i].name前面没有&? ///// 因为这是个数组,tea[i].name本身就是个地址
&tea[i]/////表示结构体数组的第i个
sizeof(struct teacher) ////表示这个结构体的大小追问
char name[20];是这个没初始化吗?怎样初始化?
追答如果没有初始化,而且读文件的时候没有读取到类容,打印出来就会是烫烫烫烫烫烫烫
memset 函数 或者name[0]='\0';或者strcpy(name,"\0");
scanf("%1d,%s,%d,%f",&tea[i].num,tea[i].name,&tea[i].age,&tea[i].salary);
可以换成
scanf("%1d,%s,%d,%f",&num,name,&age,salary);吗?
不可以,因为实在给结构体数组赋值,那些变量没有一个“妈”怎么知道是把这个值给谁,这些变量也没有定义过,只是一个局部的结构体变量
追问加上name[0]='\0';或者strcpy(name,"\0");有错?
追答。。。结构体成员啊,前面要给结构体数组的成员,strcpy(tea[0].name,"\0");像这样
参考技术C 你好!!程序没什么问题,就是应该注意输入格式:每个内容之间逗号隔开
scanf("%1d,%s,%d,%f",&tea[i].num,tea[i].name,&tea[i].age,&tea[i].salary);
%1d ,这里限定了输入的位数,只能输入一个数字,否则出错 参考技术D 就我所知道告诉你吧。
&tea[i].num----结构体中的变量。
tea[i].name---结构体中的变量 因为name是数组,可以用数组名当地址用。其余的不行。
&tea[i].age---结构体中的变量。
&tea[i].salary----结构体中的变量。
&tea[i]--结构体数组中第i个结构体的地址。
sizeof(struct teacher)---求一个struct teacher结构体的字节大小。追问
scanf("%1d,%s,%d,%f",&tea[i].num,tea[i].name,&tea[i].age,&tea[i].salary);
可以换成
scanf("%1d,%s,%d,%f",&num,name,&age,salary);吗?
以上是关于C语言 fwrite函数的主要内容,如果未能解决你的问题,请参考以下文章
C 语言文件操作 ( 按照内存块的方式读写文件 | fread 函数 | fwrite 函数 )