当前位置:首页 » 编程语言 » C语言把结构体写入文件

C语言把结构体写入文件

发布时间: 2022-04-02 08:39:26

A. c语言怎么把结构体数组写入txt文件

fopen("student.txt","wb")
b就是二进制的意思。你用二进制形式将student.txt打开
而fwrite也是将内存中的数据不经转换直接写入文件,所以文件中保存的是二进制形式,当然看到乱码了。

你试试:
if((fp1=fopen("student.txt","w"))==NULL)
{printf("cannot open this file\n");
exit(0);
}
printf("No Name Eng point Math point Phy point\n");
for(i=0;i<N;i++)
{scanf("%s,%s,%d,%f,%d,%f,%d,%f",student[i].no,student[i].name,&student[i].eng,&student[i].point1,
&student[i].math,&student[i].point2,&student[i].phy,&student[i].point3);
student[i].ave=(student[i].eng+student[i].math+student[i].phy)/3.0;
fprintf(fp1,"%s,%s,%d,%f,%d,%f,%d,%f",student[i].no,student[i].name,student[i].eng,student[i].point1,
student[i].math,student[i].point2,student[i].phy,student[i].point3);
}

就是用fprintf函数写入文件,你试试看吧。

B. c语言将结构体写入文件

谁说fwrite只能写入整形的
fwrite((void*)&variable, 1, sizeof(float), fp);
写结构体入文件时要格外注意对齐格式,最好可以单元素写,单元素读。整个结构体写入的话,如果读出程序对齐格式与写入程序不同,那读出来的数据一定是错的。

C. C语言中如何将已有结构体数据写入一个文件

用块写入 一次性把结构体的数据写入文件
fwrite

D. C语言结构体的文件写入问题

第一个问题:
void save(struct classdata *head)
函数的返回类型定义为void,建议修改为int或其他类型,总之应有返回值,因为函数的调用者是关心该函数的运行结果的。

第二个问题:
if((text=fopen(data,"wb+"))==NULL)
{printf("文件打开失败\n");
//通常这里需要返回,因为fopen操作已经失败了,后面的操作无法正确执行,应该向函数调用者返回一个错误值。不过你的这个函数声明为void类型,无法返回值,会影响到对程序的控制(因为函数的调用者不知道调用后函数的执行结果是正常结束的还是异常结束的)。
}

第三个问题:
while(head!=NULL)
{
if(fwrite(head,sizeof(struct classdata),1,text)!=1); //这一行最后的分号应删除
//这里;应该加一个左花括号
printf("数据写入失败\n");
// 这里应该加一个右花括号
head=head->transverse;
}
修改后
while(head!=NULL)
{
if(fwrite(head,sizeof(struct classdata),1,text)!=1)
{
printf("数据写入失败\n");
//注1:这里应返回一个错误值
}
head=head->transverse;
}

注1:这里有与问题二同样的情况,没有对可能出现的异常情况进行判断和处理,所以,即使发生异常,循环仍会继续进行直到最后一条记录(当fwrite出现一次异常,通常之后的操作也不会正常完成),如你的代码,就会反复输出"数据写入失败"字样。
对于你的应用程序来说,可能没有太多条记录(学生数再多也就是百或者千数量级的),所以表面上可能看不出来有什么影响。在实际的软件工程项目中,操作的如果是以百万或千万数量级的记录数(如数据库),效率上就会有很大的差别。建议养成良好的习惯,对可能出现的异常要进行判断和处理。
实际上,一个函数的代码中,真正完成函数功能的代码可能很少,但用于异常情况的判断和处理的代码可能会是实现函数功能代码的N多倍,这样才可以作出坚固、稳定的程序。

综上,个人给出建议的代码:
int save(struct classdata *head)
{
FILE *text;
char data[255]; //这里有改动,文件名字符串长度建议长一些
printf("请输入你要建立的文本名字:");
scanf("%s",data);
if((text=fopen(data,"wb+"))==NULL)
{
printf("文件打开失败\n");
return -1;
}
while(head!=NULL)
{
if(fwrite(head,sizeof(struct classdata),1,text)!=1)
{
printf("数据写入失败\n");
return -2;
}
head=head->transverse;
}
return 0;
}

E. C语言 怎么把结构体写入文件

你把结构体转成字符数组或者字符串 保存就行

F. C语言关于结构体写入文件的求助

如果想文件是可读的,可以用fprintf,用法和printf类似,一行一个结构体就好了,读的时候用fscanf
如果追求简单,那么fwrite整体二进制写入就行,读的时候用fread

G. c语言 怎么将结构体写入文件

最好用2进制方法打开文件,用fwrite 写文件。读时也用用2进制方法打开文件,用fread读.
这样,写的时候按整个结构写,读也按整个结构读,字符串有空白也没关系。
FILE *fp;

fp=fopen("my.dat","wb");
fwrite(&stu,sizeof(stu),1,fp); // 写1个结构
for (i=0;i<10;i++) fwrite(&student[i],sizeof(student),1,fp); // 写10个结构
fclose(fp);

fp=fopen("my.dat","rb");
fread(&stu,sizeof(stu),1,fp); // 读1个结构
for (i=0;i<10;i++) fread(&student[i],sizeof(student),1,fp); // 读 10个结构
fclose(fp);

H. C语言怎么把结构体写入文件

一般有两种方法.

structA
{
inta;
floatf;
chars[10];
}m;

为例:

一种是写文本文件

以"w"打开

fprintf(fp,"%d%f%s
",m.a,m.f,m.s);

另一种是写二进制文件.

以"wb"打开

fwrite(&m,sizeof(m),1,fp);

I. C语言 把结构体中的数据写入文件的问题

//根据楼主给出的结构体structstudent以及函数wirte(),稍作修改.
//假设每个学生选修的课程数目不一定相同,课程名称也不一定相同.
//以下是修改后的测试代码.

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

typedefstructstudent
{
//原代码charke[20];
charke[20][15];//可存放20个课程名称,每个名称长度最大14
charxuehao[15];//学号(学号也可以用int整数型,或者long型)
charname[15];//姓名
intchengji[21];//chengji[20]用于保存总成绩
intkeQty;//实际选修了多少个课程
floataverage;//平均分
}AO;

AOxx[50];

//输入数据
inttestInput()
{
intn;//实际输入多少个学生
intm;//选修多少个课程
inti;

n=3;

strcpy(xx[0].xuehao,"1001");
strcpy(xx[0].name,"张一");
xx[0].keQty=1;
strcpy(xx[0].ke[0],"math");
xx[0].chengji[0]=90;
m=xx[0].keQty;
for(i=0;i<m;i++)
{
xx[0].chengji[20]+=xx[0].chengji[i];
}
xx[0].average=1.0*xx[0].chengji[20]/m;

strcpy(xx[1].xuehao,"1002");
strcpy(xx[1].name,"李二");
xx[1].keQty=3;
strcpy(xx[1].ke[0],"math");
strcpy(xx[1].ke[1],"english");
strcpy(xx[1].ke[2],"C");
xx[1].chengji[0]=81;
xx[1].chengji[1]=82;
xx[1].chengji[2]=87;
m=xx[1].keQty;
for(i=0;i<m;i++)
{
xx[1].chengji[20]+=xx[1].chengji[i];
}
xx[1].average=1.0*xx[1].chengji[20]/m;

strcpy(xx[2].xuehao,"1003");
strcpy(xx[2].name,"王三");
xx[2].keQty=2;
strcpy(xx[2].ke[0],"math");
strcpy(xx[2].ke[1],"english");
xx[2].chengji[0]=85;
xx[2].chengji[1]=86;
m=xx[2].keQty;
for(i=0;i<m;i++)
{
xx[2].chengji[20]+=xx[2].chengji[i];
}
xx[2].average=1.0*xx[2].chengji[20]/m;

printf(" 录入成功. ");

returnn;
}
//写入文件
voidwriteFile(AOdata[],intn)
{
FILE*fp;
inti;
intret;

fp=fopen("save.txt","w");
if(fp==NULL)
{
printf(" 打开文件错误. ");
exit(1);
}

for(i=0;i<n;i++)//将记录逐条写入文件
{
ret=fwrite(&data[i],sizeof(AO),1,fp);
if(ret!=1)
{
printf(" 写入文件时出现错误. ");
break;
}
}
fclose(fp);
printf(" 写入文件save.txt结束. ");
}
//读取文件
voidreadFile()
{
AOtestData[50];//临时的结构体数组,只用于测试
FILE*fp;
intn;
intm;
inti,j;
intret;

fp=fopen("save.txt","r");
if(fp==NULL)
{
printf(" 打开文件错误. ");
exit(1);
}

n=0;
//函数feof(),检测是否遇到文件结束符,
//如果文件结束,则返回非1值,否则返回0
while(!feof(fp))
{
ret=fread(&testData[n],sizeof(AO),1,fp);
if(ret==1)
{
n++;
}
}
fclose(fp);//关闭文件

printf(" 读取文件结束,得到%d条记录. ",n);
for(i=0;i<n;i++)
{
printf("第%d个学生 ",i+1);
printf("学号:%s ",testData[i].xuehao);
printf("姓名:%s ",testData[i].name);
m=testData[i].keQty;
printf("选修%d个课程 ",m);
for(j=0;j<m;j++)
{
printf("%s:%d ",testData[i].ke[j],testData[i].chengji[j]);
}
printf("总成绩:%d ",testData[i].chengji[20]);
printf("平均分:%0.1f ",testData[i].average);
printf(" ");
}
}

intmain(void)
{
intn;

n=testInput();//输入数据

writeFile(xx,n);//写入文件

readFile();//读取文件

return0;
}

J. C语言中可否将整个结构体写入文件,然后取出来也是按结构体输出

可以,写的时候用指针一次性写进去,但是如果文件中写如了多个结构体你可能读取的时候要区分一下否则一次全部读出来了,读出来的时候直接赋值就行。

热点内容
电脑服务器市场 发布:2025-07-04 19:14:06 浏览:503
没签名只加密 发布:2025-07-04 18:54:38 浏览:255
红米手机存储问题 发布:2025-07-04 18:50:43 浏览:843
水电煤算法 发布:2025-07-04 18:36:44 浏览:330
天翼视讯缓存文件夹 发布:2025-07-04 18:36:43 浏览:97
unix网络编程第2卷 发布:2025-07-04 18:33:41 浏览:782
编译历史 发布:2025-07-04 18:23:01 浏览:852
空调压缩机种类 发布:2025-07-04 18:13:58 浏览:243
中国有ip6服务器吗 发布:2025-07-04 17:58:56 浏览:727
第六章编译原理答案 发布:2025-07-04 17:37:55 浏览:40