以下信息是放在文件data.txt中的,见附件
data.txt的内容如下:
学号 成绩
101 45
105 100
189 99
109 13
110 60
108 77
117 68
99 25
255 65
102 100
我知道应该先从文件中把这些数据读出来,到底是读到数组中呢
还是读到结构体中呢?读到结构体中又怎样读呢?
我应经查了好多关于文件操作的资料了,可是还是没有解决,
希望各位大虾能指点一下!!
先谢谢了
谢谢,不过你可能误解我的意思了,我的数据不是通过程序输入的,
是原来就有的,我写程序的目的就在于处理这些数据 ,如果数据很多
的话,通过一个个输入是解决不了问题的,再次感谢您的关注和帮助 !
不过我已经解决了,程序如下::
//================================================================
//程序名:data0101.c
//编程者:tinghua 沙漠里的骆驼
//编程时间:2007-09-19 12:59
//MSN:zhangshengheng@hotmail.com
//程序功能:从文件中文本文件中读取数据见到数组中,
//具体是从data.txt中读数据,放在数组中,通过比较成绩,将成绩大
//于60的学生的学号给找出来了,并按照成绩大小排序,输出到data0101.txt中
//================================================================
#include<stdio.h>
#include<conio.h>
#include<process.h>
FILE *fp;
int buf[100][2];//定义缓冲区,存储从文件读出的数据
int data[50][2];//定义存放成绩大于60的学生的成绩
void display(int n,int x[][2])//显示函数
{
int i,j;
for(i=0;i<n;i++)
for(j=0;j<2;j++)
{
printf("%d ",x[i][j]);
if(j==1) printf("\n");
}
}
void read_file()//从文件中格式化读入数据子函数
{
int i;
if((fp=fopen("data.txt","r"))==NULL)//打开文件
{
printf("\nCannot open this file.press any key to exit!\n");
getch();
exit(1);
}
while(!feof(fp)) //从文件中格式化读入数据
{
for(i=0;i<10;i++)
fscanf(fp,"%d%d", &buf[i][0],&buf[i][1]);
}
printf("\n\nthe data.txt has been succeeded to read ,the data is:\n");
if(fclose(fp)!=0)//关闭文件
{
printf("\n the file cannot be closed!press any key to exit\n");
getch();
exit(1);
}
}
void write_file()//向文件中格式化写入数据子函数
{
int i,j;
if((fp=fopen("data0101.txt","w+"))==NULL)//打开文件
{
printf("\nCannot open this file.press any key to exit!\n");
getch();
exit(1);
}
for(i=0;i<7;i++)//格式化输出到文件
{
for(j=0;j<2;j++)
{
fprintf(fp,"%8d%7d",data[i][j]);
if(j==1) fprintf(fp,"\n");
}
}
if(fclose(fp)!=0)//关闭文件
{
printf("\n the file cannot be closed!press any key to exit\n");
getch();
exit(1);
}
}
int main(void)
{
int i,j=0;
display(10,buf);//显示子函数,将从文件中调入的数据显示出来
for(i=0;i<10;i++)//从读入的数据中选出成绩大于60的学生
{
if(buf[i][1]>=60)
{
data[j][1]=buf[i][1];
data[j][0]=buf[i][0];
j++;
}
}
printf("\n\nthe students whose score >60 are: \n");
display(j,data);//显示成绩大于60的学生
write_file();//将成绩大于60的学生写入文件
return 0;
}
还有别人用结构体实现的程序:
#include <stdio.h>
#include <stdlib.h>
typedef struct _student
{
int id;
int score;
} Student;
int readData(Student** p, FILE* pf)
{
int n = 8, i = 0;
*p = (Student*)malloc(n * sizeof(Student));
while(fscanf(pf, "%d %d", &(*p)[i].id, &(*p)[i].score) != -1)
{
if(++i == n)
{
n <<= 1;
*p = (Student*)realloc(*p, n * sizeof(Student));
}
}
*p = (Student*)realloc(*p, i * sizeof(Student));
return i;
}
int main(void)
{
Student* pstu = 0;
int n = 0, i = 0;
FILE* pf = fopen("data.txt", "r");
if(!pf)
printf("error!\n");
else
{
n = readData(&pstu, pf);
for(i = 0; i < n; i++)
if(pstu[i].score > 60)
printf("id = %d\tscore = %d\n", pstu[i].id, pstu[i].score);
}
free(pf);
return 0;
}
这里用的是结构数组,也可以用链表实现,方法很多就看你怎么用了
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
struct student{
char id[10];
float grade;
};
int print(struct student *stu,float grade,int n)
{
int i;
printf("%-10s%-7s","学号","成绩");
for(i=0;i<n;i++)
{
if(stu[i].grade>grade)
printf("\n%-10s%-7.2f",stu[i].id,stu[i].grade);
}
return 0;
}
int read(struct student *stu,char *FileName)
{
int len=0;
char buf[64];
FILE *fp;
if((fp=fopen(FileName,"r"))==NULL)
{
printf("打开文件%s失败!",FileName);
getch();
return -1;
}
memset(buf,0,sizeof(buf));
fgets(buf,64,fp);
memset(buf,0,sizeof(buf));
while(fgets(buf,64,fp))
{
strcpy(stu[len].id,strtok(buf," "));
stu[len].grade=(float)atof(strtok(NULL," "));
len++;
memset(buf,0,sizeof(buf));
}
fclose(fp);
return len;
}
int main()
{
int len;
char *FileName="data.txt";
struct student stu[500];
len=read(stu,FileName);
print(stu,60,len);
getch();
return 0;
}
[此贴子已经被作者于2007-9-19 17:40:39编辑过]