C语言问题,课程设计,文件的读写有问题,将数据写进文件后,读出来的是乱码,求解决
这个程序有两个功能,一个是添加图书信息,一个是输入编号显示图书其他信息#include<stdio.h>#include<stdlib.h>#include<string...
这个程序有两个功能,一个是添加图书信息,一个是输入编号显示图书其他信息
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <windows.h>
void input();
void findnumber();
typedef struct node{
int number;
char name[20];
char writer[20];
char press[20];
int price;
struct node *next;
}tushu;
int num=0,n,i,m;
tushu *p0=NULL;
void main()
{ char c;
do
{ system("cls");
printf("****************************************\n");
printf(" 1: 添加一个图书信息 \n");
printf(" 2: 输入编号查找一个图书 \n");
printf(" 3: 输入作者姓名查找一个图书 \n");
printf(" 4: 输入出版社查找一个图书 \n");
printf(" 5: 退出 \n");
printf("****************************************\n");
printf(" \n");
printf("请选择输入选项[1\\2\\3\\4\\5]:>");
do
{ c=getchar();
}while(c!='1'&&c!='2'&&c!='3'&&c!='4'&&c!='5');
getchar();
switch(c)
{ case '1': input(); break;
case '2': findnumber(); break;
case '3': findwriter(); break;
case '4': findpress(); break;
case '5': exit(0); break;
}
printf(" 按任意键返回主菜单:\n");
getchar();
system("cls");
}while(1);
}
tushu *creat()
{ tushu *p1,*p2;
n=0;
p0=NULL;
p1=p2=(struct node*)malloc(sizeof(struct node));
printf("请输入/图书编号/书名/作者/出版社/价格\n");
scanf("%d",&p1->number);
scanf("%s",&p1->name);
scanf("%s",&p1->writer);
scanf("%s",&p1->press);
scanf("%d",&p1->price);
while(n<m-1)
{ n=n+1;
if(n==1) p0=p1;
else p2->next=p1;
p2=p1;
p1=(struct node*)malloc(sizeof(struct node));
printf("请输入/图书编号/书名/作者/出版社/价格\n");
scanf("%d",&p1->number);
scanf("%s",&p1->name);
scanf("%s",&p1->writer);
scanf("%s",&p1->press);
scanf("%d",&p1->price);
}
getchar();
p2->next=NULL;
free(p1);
return(p0);
}
void input()
{ FILE *fp;
tushu *p;
printf("请输入要添加的个数:");
scanf("%d",&m);
creat();
if((fp=fopen("oo.out","wb"))==NULL)
{ printf("******");
exit(0);
}
p=p0;
while(p!=NULL){
fwrite(&p,sizeof(struct node),1,fp);
p=p->next;
}
fclose(fp);
printf(" 添加信息成功! ");
}
void findnumber()
{ FILE *fp;
tushu *p1,*p2,*p;
printf("请输入编号:");
scanf("%d",&num);
p0=p1=p2=NULL;
if((fp=fopen("oo.out","rb"))==NULL)
{ printf("found nothing!");
}
p1=(struct node*)malloc(sizeof(struct node));
p0=p1;
while(!feof(fp))
{ if((fread(p1,sizeof(struct node),1,fp))!=1)break;
p1->next=(struct node*)malloc(sizeof(struct node));
if(p1->next==NULL) break;
p2=p1;
p1=p1->next;
}
p=p0;
while(p!= NULL)
{ if(p->number==num)
{printf("yes!");}
else {printf("no!");}
p=p->next;
}
getchar();
} 展开
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <windows.h>
void input();
void findnumber();
typedef struct node{
int number;
char name[20];
char writer[20];
char press[20];
int price;
struct node *next;
}tushu;
int num=0,n,i,m;
tushu *p0=NULL;
void main()
{ char c;
do
{ system("cls");
printf("****************************************\n");
printf(" 1: 添加一个图书信息 \n");
printf(" 2: 输入编号查找一个图书 \n");
printf(" 3: 输入作者姓名查找一个图书 \n");
printf(" 4: 输入出版社查找一个图书 \n");
printf(" 5: 退出 \n");
printf("****************************************\n");
printf(" \n");
printf("请选择输入选项[1\\2\\3\\4\\5]:>");
do
{ c=getchar();
}while(c!='1'&&c!='2'&&c!='3'&&c!='4'&&c!='5');
getchar();
switch(c)
{ case '1': input(); break;
case '2': findnumber(); break;
case '3': findwriter(); break;
case '4': findpress(); break;
case '5': exit(0); break;
}
printf(" 按任意键返回主菜单:\n");
getchar();
system("cls");
}while(1);
}
tushu *creat()
{ tushu *p1,*p2;
n=0;
p0=NULL;
p1=p2=(struct node*)malloc(sizeof(struct node));
printf("请输入/图书编号/书名/作者/出版社/价格\n");
scanf("%d",&p1->number);
scanf("%s",&p1->name);
scanf("%s",&p1->writer);
scanf("%s",&p1->press);
scanf("%d",&p1->price);
while(n<m-1)
{ n=n+1;
if(n==1) p0=p1;
else p2->next=p1;
p2=p1;
p1=(struct node*)malloc(sizeof(struct node));
printf("请输入/图书编号/书名/作者/出版社/价格\n");
scanf("%d",&p1->number);
scanf("%s",&p1->name);
scanf("%s",&p1->writer);
scanf("%s",&p1->press);
scanf("%d",&p1->price);
}
getchar();
p2->next=NULL;
free(p1);
return(p0);
}
void input()
{ FILE *fp;
tushu *p;
printf("请输入要添加的个数:");
scanf("%d",&m);
creat();
if((fp=fopen("oo.out","wb"))==NULL)
{ printf("******");
exit(0);
}
p=p0;
while(p!=NULL){
fwrite(&p,sizeof(struct node),1,fp);
p=p->next;
}
fclose(fp);
printf(" 添加信息成功! ");
}
void findnumber()
{ FILE *fp;
tushu *p1,*p2,*p;
printf("请输入编号:");
scanf("%d",&num);
p0=p1=p2=NULL;
if((fp=fopen("oo.out","rb"))==NULL)
{ printf("found nothing!");
}
p1=(struct node*)malloc(sizeof(struct node));
p0=p1;
while(!feof(fp))
{ if((fread(p1,sizeof(struct node),1,fp))!=1)break;
p1->next=(struct node*)malloc(sizeof(struct node));
if(p1->next==NULL) break;
p2=p1;
p1=p1->next;
}
p=p0;
while(p!= NULL)
{ if(p->number==num)
{printf("yes!");}
else {printf("no!");}
p=p->next;
}
getchar();
} 展开
1个回答
展开全部
先说下错误。
读取,文件是用a+方式打开,这读取数据,因为文件指针在最末的关系,读取出来的数据是空的,所以n永远为0。
其次,在写数据前,没有fclose文件就再fopen一次,这是正确的文件操作方式?
最后,老实说,看你的代码头很痛,不是说代码很难,而是这个格式实在太难看,很多时候,一看到这种混乱的代码,直接看都不看就关掉的。在诸多IDE的今天,写一段格式整齐的代码很难么,不要跟我说你是用windows记事本写代码的。
最最后,下面是整理并修改正确的代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#ifndef MAX_NUM
#define MAX_NUM 100
#endif
typedef struct student
{
char num[11];
int math;
int eng;
int chin;
int ave;
int totle;
}stu;
void main()
{
stu a[MAX_NUM];
int i = 0, n = 0, k = 0;
FILE *fp = fopen("e:\\student.txt","rb+");
for(n = 0; fp && fread(&a[n], 1, sizeof(stu), fp) != 0; ++n) ;
printf("请输入要添加的信息");
printf("\n请输入第%d个学生信息:\n",n + 1);
printf("学号:\n");
scanf("%s",a[n].num);
printf("math成绩:\n");
scanf("%d",&a[n].math);
printf("english成绩:\n");
scanf("%d",&a[n].eng);
printf("chin成绩:\n");
scanf("%d",&a[n].chin);
a[n].totle=a[n].math+a[n].eng+a[n].chin;
a[n].ave=a[n].totle/3;
for(k = n-1; k >= 0; k--)
{
if(strcmp(a[k].num,a[n].num) == 0)
{
printf("该学生已经存在,请重新输入");
break;
}
}
if(fp == NULL && (fp = fopen("e:\\student.txt","wb")) == NULL)
{
printf("open file error!\n");
exit(0);
}
fseek(fp, 0, SEEK_SET);
for(i = 0; i <= n; i++)
fwrite(&a[i], 1, sizeof(a[0]), fp);
fclose(fp);
}
读取,文件是用a+方式打开,这读取数据,因为文件指针在最末的关系,读取出来的数据是空的,所以n永远为0。
其次,在写数据前,没有fclose文件就再fopen一次,这是正确的文件操作方式?
最后,老实说,看你的代码头很痛,不是说代码很难,而是这个格式实在太难看,很多时候,一看到这种混乱的代码,直接看都不看就关掉的。在诸多IDE的今天,写一段格式整齐的代码很难么,不要跟我说你是用windows记事本写代码的。
最最后,下面是整理并修改正确的代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#ifndef MAX_NUM
#define MAX_NUM 100
#endif
typedef struct student
{
char num[11];
int math;
int eng;
int chin;
int ave;
int totle;
}stu;
void main()
{
stu a[MAX_NUM];
int i = 0, n = 0, k = 0;
FILE *fp = fopen("e:\\student.txt","rb+");
for(n = 0; fp && fread(&a[n], 1, sizeof(stu), fp) != 0; ++n) ;
printf("请输入要添加的信息");
printf("\n请输入第%d个学生信息:\n",n + 1);
printf("学号:\n");
scanf("%s",a[n].num);
printf("math成绩:\n");
scanf("%d",&a[n].math);
printf("english成绩:\n");
scanf("%d",&a[n].eng);
printf("chin成绩:\n");
scanf("%d",&a[n].chin);
a[n].totle=a[n].math+a[n].eng+a[n].chin;
a[n].ave=a[n].totle/3;
for(k = n-1; k >= 0; k--)
{
if(strcmp(a[k].num,a[n].num) == 0)
{
printf("该学生已经存在,请重新输入");
break;
}
}
if(fp == NULL && (fp = fopen("e:\\student.txt","wb")) == NULL)
{
printf("open file error!\n");
exit(0);
}
fseek(fp, 0, SEEK_SET);
for(i = 0; i <= n; i++)
fwrite(&a[i], 1, sizeof(a[0]), fp);
fclose(fp);
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询