c语言 用fwrite写入txt的文件,为啥是一堆乱码呢 ,下面是我的程序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言 用fwrite写入txt的文件,为啥是一堆乱码呢 ,下面是我的程序相关的知识,希望对你有一定的参考价值。

void addRecord(void)

int i;
char str[10];
int val=0,unval=0;
char s[3];
FILE *fp;

if(numApps==0)
printf("原来没有记录,现在建立新的记录\n");
else
printf("下面在当前文件添加新的记录\n");

while(1)

printf("确定要添加一组新设备信息?(Y/N)");
gets(s);
if(s[0]=='n'||s[0]=='N') //不再添加信息
break;
if(numApps>=Record_arraySize) //数组空间不足,需要重新申请空间

records=realloc(records,(Record_arraySize+INCR_SIZE)*sizeof(AppInfo));
if(records==NULL)

printf("memory failed!");
exit(-1);

Record_arraySize=Record_arraySize+INCR_SIZE;


printf("\n\t请输入设备仪器的信息\n");
printf("\t编号:");
gets(records[numApps].number);
printf("\t名称:");
gets(records[numApps].name);
printf("\t单价:");
gets(str);
records[numApps].price=(float)atof(str);
printf("\t购进日期:");
gets(records[numApps].inDate);
printf("\t生产厂家: ");
gets(records[numApps].producter);
printf("\t购进数量: ");
gets(str);
records[numApps].count=(int)atoi(str);
while(Usability_arraySize<records[numApps].count)


Usability_arraySize+=INCR_SIZE;


printf("\t仪器设备的可用性(Y)与不可用性(N):\n");
for(i=1;i<=records[numApps].count;i++)

printf("\t第%d台的可用性:",i);
gets(s);
records[numApps].usability[i-1]=s[0];


numApps++;
printf("\n是否继续添加新的设备信息?(Y/N)");
gets(s);
if(s[0]=='n'||s[0]=='N')
break;


printf("现在一共有%d条记录\n",numApps);

printf("存文件……\n");

fp=fopen("app_info.txt","w");
for(i=0;i<numApps;i++)

fwrite(&records[i],sizeof(AppInfo),1,fp);


fclose(fp);
printf("%d条记录已经存入文件!\n",numApps);


下面是我保存文件出现的对话框

参考技术A         FILE *fp;
        //写入
if((fp=fopen("database.txt", "w"))==NULL) 
return;
 
fprintf(fp,"%s\\t", name);
 
 
  //读
  if((fp=fopen("database", "r"))==NULL)
printf("Read error");
return;
 

fscanf(fp,"%s\\t", sname);

fclose(fp);

参考技术B 如下定义:
struct apparatus_info //定义仪器设备信息结构体
char number[10]; //设备编号
char name[20]; //设备名称
double price; //设备单价
char inDate[20]; //购进的时间
char producter[20]; //生产厂家
int count; //购进的数量
char usability[INITIAL_SIZE]; //设备的可用性
;
问题有好几处,也有几种方法解决

1,
分配给records[numApps]的内存空间虽然是给它使用
但是它没有初始化,里面是有一堆乱七八糟的数据

之后你保存到records[numApps]里的数据
如果没有用完numApps空间
尾巴还是有一堆乱七八糟的数据

所以不干净

如果records[numApps]是字符串
搬进去住前先把房间打扫一下,用
memset(records,0,numApps);
就是让它的存储空间全部写0

但是你的records[numApps]是结构体数组
所以需要另外保证每组数据的每个成员都有写值

2,
你用的是gets(str);
输入的是字符串,回车结束
str是10,而records得成员有10,20,这就有隐患

3,
atof和atoi函数使用的时候要小心
对于atoi和atof,
有新的函数可以替代
atoi可以用strtol替代,
而atof可以用strtod等替代
strtol比atoi安全,
records[numApps].price=(float)atof(str);
改成
records[numApps].price=(double)atof(str);

4,
输入records[numApps]成员数据的时候不如用
scanf("%d%f%s",&......);
格式化输入安全

5,
fp=fopen("app_info.txt","w");
是以文本方式写入文件的
fwrite(&records[i],sizeof(AppInfo),1,fp);
验证app_info.txt是文本还是二进制
fwrite的第一个参数是字符串,是文本
fwrite的第一个参数是int或float,是二进制
你的参数是结构体,数据类型复杂,app_info.txt是二进制
具体情况要具体分析

还有fwrite输出结构体数组数据,一句话多痛快
但是你要阅读,或者用程序读出来的时候你会感觉登山一样难

所以用fprintf格式化输出安全
for(i=0;i<numApps;i++)

fprintf(fp,"=============================\n");
fprintf(fp,"%s\n",&records[i].number);
fprintf(fp,"%s\n",&records[i].name);
fprintf(fp,"%f\n",&records[i].price);
fprintf(fp,"%s\n",&records[i].inDate);
fprintf(fp,"%s\n",&records[i].producter);
fprintf(fp,"%d\n",&records[i].count);
fprintf(fp,"%s\n",&records[i].usability);


6,
真要用fwrite
建议如下
char outbuf[max_buf]; //max_buf=1000或更大,保证够用
char tempbuf[20];
memset(outbuf,0,max_buf);

for(i=0;i<numApps;i++)

sprintf(tempbuf,"%s\n",&records[i].number);
strcat(outbuf,tempbuf);
sprintf(tempbuf,"%s\n",&records[i].name);
strcat(outbuf,tempbuf);
sprintf(tempbuf,"%f\n",records[i].price);
strcat(outbuf,tempbuf);
sprintf(tempbuf,"%s\n",&records[i].inDate);
strcat(outbuf,tempbuf);
sprintf(tempbuf,"%s\n",&records[i].producter);
strcat(outbuf,tempbuf);
sprintf(tempbuf,"%d\n",records[i].count);
strcat(outbuf,tempbuf);
sprintf(tempbuf,"%s\n",&records[i].usability);
strcat(outbuf,tempbuf);


if(fwrite(outbuf,strlen(outbuf),1,fp)!=1)

printf("写入错误!\n");

看,还是要格式化输出tempbuf,outbuf过渡一下
让fwrite写的是字符串

7,
输出前可以用下面printf显示来看看
学会debug
for(i=0;i<numApps;i++)

printf("%s\n",&records[i].number);
printf("%s\n",&records[i].name);
printf("%f\n",records[i].price);
printf("%s\n",&records[i].inDate);
printf("%s\n",&records[i].producter);
printf("%d\n",records[i].count);
printf("%s\n",&records[i].usability);
本回答被提问者采纳

以上是关于c语言 用fwrite写入txt的文件,为啥是一堆乱码呢 ,下面是我的程序的主要内容,如果未能解决你的问题,请参考以下文章

c语言文件操作fwrite和fread

C语言中,把数据储存在txt文件中的代码怎么写的?

在C语言中,fopen一个文件 如何能够在写入新的数据覆盖原文件中指定长度的内容

PHP将数据写入指定文件中

matlab中使用fwrite将1到10写入文本文件中,再用fread读取该文本文件中的数据,怎么写程序

c语言读取文件数据乱码