| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 906 人关注过本帖
标题:文件的输入输出出错了 请指点一下。。
只看楼主 加入收藏
hover58
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2007-10-30
收藏
 问题点数:0 回复次数:7 
文件的输入输出出错了 请指点一下。。
输入学生成绩 存入文件中
读取文件数据存入结构体数组中  计算出总分
输出这段程序

请哪位 高人 帮忙看一下 怎么编译器 能够通过 但是运行的时候会出错呢?
#include <stdio.h>
#include <stdlib.h>
typedef struct student{
 int id;
 char name[20];
 int mid;
 int end;
 int total;
}ST;
int read_records(FILE *f,ST *s,int n);
void print_records(ST *s,int n);
int main(void)
{
 FILE *f=NULL;
 int n=0;
 ST *s=NULL;
 n=read_records(f,s,n);
 print_records(s,n);
 free(s);
 return 0;
}
int read_records(FILE *f,ST *s,int n)
{
 int i;
 ST a;
 char line[50];
 if((f=fopen("st.txt","w"))==NULL){
  printf("Can't open it\n");
  exit(1);
 };
 printf("请输入学号 名字 期中 期末(ctrl+z结束输入)\n ");
 fgets(line,50,stdin);
 while(!feof(stdin)){
  sscanf(line,"%d %s %d %d ",
   &a.id,a.name,&a.mid,&a.end);
  fwrite(s,sizeof(ST),1,f);
  n++;
  fgets(line,50,stdin);
 
 }
 fclose(f);
 s=malloc(sizeof(ST)*n);
 if((f=fopen("st.txt","r"))==NULL){
  printf("无法打开文件\n");
  exit(1);
 };
 for(i=0;i<n;i++)
  fread((s+i),sizeof(ST),1,f);
 fclose(f);
 return(n);
}
void print_records(ST *s,int n)
{
 int i=0;
 for(i=0;i<=n;i++)
  (s+i)->total=(s+i)->mid+(s+i)->end;
 printf("    --------------------------------    \n");
 printf("ID     NAME   MID  END  TOTAL  \n");
 printf("    --------------------------------    \n");
 for(i=0;i<=n;i++)
  printf("%d      %s       %d    %d    %d   \n",
  (s+i)->id,(s+i)->name,(s+i)->mid,(s+i)->end,(s+i)->total);
 printf("    --------------------------------    \n");
}
搜索更多相关主题的帖子: 文件 输出 输入 
2007-11-23 20:16
huangchundong
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2007-11-24
收藏
得分:0 
提供这个程序,希望对你有帮助!其实读写文件可以有更加简单的方法,没有必要这么麻烦的!这个程序非常简单,并且界面很粗糙,可以进一步完善!
#include <stdio.h>
#include <stdlib.h>
typedef struct student
{:victory:
int id;
char name[20];
int mid;
int end;
int total;
}ST;
void enter()
{
ST record;
FILE *fp;
fp=fopen("record.txt","rb"); /*以只读的方式打开二进制文件record.txt*/
if(fp==NULL)
fp=fopen("record.txt","wb");/*以写的方式打开文件*/
else
{
fclose(fp);
fp=fopen("record.txt","ab");/*以追加的方式打开文件*/
}
printf("enter id number:");
scanf("%d",&record.id);
printf("\nenter name:");
scanf("%s",record.name);
printf("\nenter qi zhong cheng ji:");
scanf("%d",&record.mid);
printf("\nenter qi mo cheng ji:");
scanf("%d",&record.end);
record.total=0;
fwrite(&record,sizeof(ST),1,fp);/*以块的方式把记录写入文件*/
}
void display()
{
ST record;
FILE *fp;
int i,j,k;
fp=fopen("record.txt","rb");
if(fp==NULL)
 {
  printf("********sorry,the file is not exit**********");
  fclose(fp);
 }
else
 {
  while(fread(&record,sizeof(ST),1,fp))
   {
     printf("id number:%d\n",record.id);
     printf("   name  :%s\n",record.name);
     i=record.mid;
     printf("mid score:%d\n",i);
     j=record.end;
     printf("end score:%d\n",j);
     k=record.total=i+j;
     printf("  total  :%d\n",k);
   }
  fclose(fp);
 }
}
void main()  /*主函数*/
{
int i,num;
clrscr();            /*清屏*/
do
{
   clrscr();
   printf("*****MENU*******\n");
   printf("1:enter record\n");
   printf("2:display record\n");
   printf("3:exit\n");
   printf("please enter your choice between 1-3\n");
   scanf("%d",&num);
   switch(num)   
     {                    
 case 1:clrscr();enter();break;
        case 2:clrscr();display();break;  
 case 3:exit(0);       /*退出操作*/
      }
   getch();
  }while(num!=3);
}


2007-11-24 00:14
飞天流星
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2007-11-18
收藏
得分:0 
都不检查就输出来了,有几个地方错了.
#include <stdio.h>
#include <stdlib.h>
#include<windows.h>
#include<conio.h>
typedef struct student
{
int id;
char name[20];
int mid;
int end;
int total;
}ST;
void enter()
{
ST record;
FILE *fp;
fp=fopen("record.txt","rb"); /*以只读的方式打开二进制文件record.txt*/
if(fp==NULL)
fp=fopen("record.txt","wb");/*以写的方式打开文件*/
else
{
fclose(fp);
fp=fopen("record.txt","ab");/*以追加的方式打开文件*/
}
printf("enter id number:");
scanf("%d",&record.id);
printf("\nenter name:");
scanf("%s",record.name);
printf("\nenter qi zhong cheng ji:");
scanf("%d",&record.mid);
printf("\nenter qi mo cheng ji:");
scanf("%d",&record.end);
record.total=0;
fwrite(&record,sizeof(ST),1,fp);/*以块的方式把记录写入文件*/
}
void display()
{
ST record;
FILE *fp;
int i,j,k;
fp=fopen("record.txt","rb");
if(fp==NULL)
{
  printf("********sorry,the file is not exit**********");
  fclose(fp);
}
else
{
  while(fread(&record,sizeof(ST),1,fp))
   {
     printf("id number:%d\n",record.id);
     printf("   name  :%s\n",record.name);
     i=record.mid;
     printf("mid score:%d\n",i);
     j=record.end;
     printf("end score:%d\n",j);
     k=record.total=i+j;
     printf("  total  :%d\n",k);
   }
  fclose(fp);
}
}
void main()  /*主函数*/
{
int num;
system("CLS");            /*清屏*/
do
{
 system("CLS");
   printf("*****MENU*******\n");
   printf("1:enter record\n");
   printf("2:display record\n");
   printf("3:exit\n");
   printf("please enter your choice between 1-3\n");
   scanf("%d",&num);
   switch(num)   
     {                    
case 1:system("CLS");enter();break;
        case 2:system("CLS");display();break;  
case 3:exit(0);       /*退出操作*/
      }
   getch();
  }while(num!=3);
}
2007-11-24 08:43
huangchundong
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2007-11-24
收藏
得分:0 
晕死!不同的编译器可能不同的。我用的是tc2.0,完全没有问题........:L
2007-11-24 13:25
huangchundong
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2007-11-24
收藏
得分:0 
好像少了一句话:在enter()函数这里的最后应该加上一句:fclose(fp);:) :)
2007-11-24 13:29
hover58
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2007-10-30
收藏
得分:0 
:) 首先谢谢大家的帮助  
其实我主要想 建立一个 动态内存 然后用fread();把数据存入student结构体的数组中...
然后用结构体的数组来操作整个程序.
2007-11-24 14:13
hover58
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2007-10-30
收藏
得分:0 
现在我把代码改成了这个样子.如果我直接输入的时候ctrl+z结束的话  还是可以运行到下面的 结果输出模式的.
但是如果我输入了 数据  就会出现
"0X00403732"指令引用的"0X00000000"内存.该内存不能为read
这个是怎么回事.....请高人指教...
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct student{
 char name[20];
 int mid;
 int end;
 int total;
}ST;
int main(void)
{
 FILE *f;
 int n=0;
 ST *s=NULL;
 int i;
 ST a;
 char line[50];
 if((f=fopen("st.txt","wb"))==NULL){
  printf("Can't open it\n");
  exit(1);
  };
 printf("请输入名字 期中 期末(ctrl+z结束输入)\n ");
 fgets(line,50,stdin);
 while(!feof(stdin)){
  sscanf(line," %s %d %d ",
   a.name,&a.mid,&a.end);
  fwrite(s,sizeof(ST),1,f);
  n++;//一共写入了n个数据
  fgets(line,50,stdin);
  }
  fclose(f);
 s=(ST*)malloc(sizeof(ST)*n);//s指向动态内存的首地址
 if((f=fopen("st.txt","rb"))==NULL){
  printf("无法打开文件\n");
  exit(1);
  };
 for(i=0;i<=n;i++)
  fread((s+i),sizeof(ST),1,f);//把数据写入s[n]中
 fclose(f);
 for(i=0;i<=n;i++)
  (s+i)->total=(s+i)->mid+(s+i)->end;
 
printf("    ---------------------------------------------------------    \n");
printf("ID     NAME          MID       END      TOTAL  \n");
printf("    ---------------------------------------------------------    \n");
 for(i=0;i<=n;i++)
  printf("%d      %s       %d    %d    %d   \n",
  i+1,(s+i)->name,(s+i)->mid,(s+i)->end,(s+i)->total);
printf("    -------------------------------- -------------------------   \n");
 free(s);//释放
 return 0;
}
2007-11-24 14:49
hover58
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2007-10-30
收藏
得分:0 
顶以下......................
2007-11-25 15:02
快速回复:文件的输入输出出错了 请指点一下。。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019471 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved