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个回答  2013-10-08
scanf("%1d,%s,%d,%f",&tea[i].num,tea[i].name,&tea[i].age,&tea[i].salary);要求输入的格式是用逗号分隔的,所以,你要console输入要使用逗号分隔符。
在控制台输入 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;

第2个回答  2013-10-08
编译没错,运行的时候有错,出现很多烫 ////数组没初始化
&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");像这样

第3个回答  2013-10-08
你好!!
程序没什么问题,就是应该注意输入格式:每个内容之间逗号隔开
scanf("%1d,%s,%d,%f",&tea[i].num,tea[i].name,&tea[i].age,&tea[i].salary);

%1d ,这里限定了输入的位数,只能输入一个数字,否则出错
第4个回答  2013-10-08
就我所知道告诉你吧。
&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);吗?

fwrite函数的用法
1、文件写入功能:fwrite函数是C语言标准库中的一个文件操作函数,主要用于将指定内存区域的内容写入到已打开的二进制文件中。其特点在于能够以块的形式高效地进行数据写入,特别适合于大容量数据的存储和传输。2、缓冲机制支持:在实际使用过程中,fwrite通常会结合操作系统的文件缓冲机制来提高写入效率。即使...

c语言fwrite、fread、write、read的区别
C语言中,fwrite()和fread()是标准库中专门用于文件操作的函数,它们与UNIX系统的write()和read()有所不同。尽管底层实现可能会调用这些底层函数,但性能上,推荐一次处理大量数据以减少频繁操作。首先,让我们了解fwrite()和它的对应函数fread()。fwrite()用于将指针ptr指向的数据,每个大小为size字节,...

c语言fwrite函数输出名字n次?
在C语言中,fwrite()函数用于将数据写入文件。如果你想要将某个名字写入文件n次,你可以使用一个循环来实现这个功能。以下是一个示例代码,它将名字"John Doe"写入文件"names.txt"中10次:include <stdio.h> int main() { FILE *file = fopen("names.txt", "w");if (file == NULL) { pri...

C语言fwrite()函数以二进制形式写入文件
C语言中的fwrite()函数确实用于以二进制形式向文件写入数据,但这个事实并不意味着用文本编辑器打开文件后,内容会直接以二进制格式呈现。实际上,大多数文本编辑器默认是以ASCII或UTF-8等文本格式解析文件内容,而非二进制。当你使用fwrite()将二进制数据写入文件时,文件中存储的是原始的二进制位,每个...

c语言fwrite、fread、write、read的区别
在C语言中,fwrite()和fread()是标准库中处理文件读写的工具,而write()和read()则是系统级别的函数。它们的主要差异在于使用场景和底层机制。尽管fwrite()和fread()看似直接操作,但实际操作中会借助write()和read()来完成。为了优化性能,应尽量减少频繁的小规模文件操作,一次处理大量数据。1. ...

c语言 fwrite函数 是插入还是覆盖
fwrite函数是覆盖而不是插入。只要打开文件时知名支持写操作,那么使用fwrite函数时均是覆盖模式,而不会插入。即在当前位置写入数据,后续数据并不会依次后移,而是直接覆盖。比如,如果文件中有数据123456789,在3的位置写入字符abc,那么结果为 12abc6789。如果要实现插入效果,可以将后续数据读到内存,然后...

f_write一次写多少字节
1023*5个字节。根据查询C语言的内容得知:通过f_write函数最多可以写入1024*5个字节。fwrite() 是 C 语言标准库中的一个文件处理函数,功能是向指定的文件中写入若干数据块,如成功执行则返回实际写入的数据块数目。该函数以二进制形式对文件进行操作,不局限于文本文件。

c语言 fwrite的四个参数分别是什么
fwrite(buffer,size,count,fp);举个例:fwrite(&id,1,10,f)就是把id里面的值写到f里面,每次写1个字节,一共写10次或是fread(&id,10,1,f)就是把id里面的值读到里面,每次读10个字节,一共读1次。参数分别是指针,整型,整型,指针 ...

C语言中fwrite函数输入时会覆盖文件以前的数据吗?
fwrite写入时覆盖不覆盖原来文件是用参数决定的 fwrite原型:size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);返回值:返回实际写入的数据块数目 (1)buffer:是一个指针,对fwrite来说,是要获取数据的地址;(2)size:要写入内容的单字节数;(3)count:要进行...

C语言 fwrite()和fprintf()的区别
fwrite是按二进制写数据到文件,而fprintf是严格按照参数里边的格式控制符,写数据到文件。可以是十进制,二进制,字符串,等等,而且可以直接打开文件查看数据,二进制文件是不能直接打开文件查看数据的。

相似回答