当前位置: 代码迷 >> C语言 >> [求助]关于C语言对文件的操作 ,如何从文件中检索有用信息
  详细解决方案

[求助]关于C语言对文件的操作 ,如何从文件中检索有用信息

热度:442   发布时间:2007-09-19 10:25:33.0
[求助]关于C语言对文件的操作 ,如何从文件中检索有用信息
我想从以下数据中检索出成绩大于60的学生的学号
以下信息是放在文件data.txt中的,见附件
data.txt的内容如下:
学号 成绩
101 45
105 100
189 99
109 13
110 60
108 77
117 68
99 25
255 65
102 100

我知道应该先从文件中把这些数据读出来,到底是读到数组中呢
还是读到结构体中呢?读到结构体中又怎样读呢?
我应经查了好多关于文件操作的资料了,可是还是没有解决,
希望各位大虾能指点一下!!
先谢谢了
搜索更多相关的解决方案: 文件中  C语言  有用信息  检索  学号  

----------------解决方案--------------------------------------------------------
我昨天也写了个,不过是从二进制文件中读出,用fread读出存放在一个结构体中。文本方式还真不知道怎么读出
----------------解决方案--------------------------------------------------------
二进制也行,你能不能将你的代码让我看看,对了要有你处理的
数据,谢谢
----------------解决方案--------------------------------------------------------
题目:输入三个学生的数据存入文件,然后从文件中读出;
#include <stdio.h>
struct student
{
char name[10];
int age;
long num;
}s[3],t;
int main()
{
FILE *fp;
int i;
if((fp=fopen("d:\\student.txt","wb"))==NULL)
{
printf("Erroor opening file d:\\student.txt\n");
exit(1);
}
for(i=0;i<3;i++)
{
printf("Input name:");
scanf("%s",s[i].name);
printf("Input age:");
scanf("%d",&s[i].age);
printf("Input number:");
scanf("%ld",&s[i].num);
}
if(fwrite(s,sizeof(struct student),3,fp)!=3)
{
printf("Erroe writing file d:\\student.txt\n");
exit(1);
}
fclose(fp);
if((fp=fopen("d:\\student.txt","rb"))==NULL)
{
printf("Erroor opening file d:\\student.txt\n");
exit(1);
}
i=0;
while(fread(&t,sizeof(struct student),1,fp)==1)
{
i++;
printf("the %dth student:\n",i);
printf("name:%s\n",t.name);
printf("age:%d\n",t.age);
printf("number:%ld\n",t.num);
}
fclose(fp);
return 0;
}
将学生数据改成学号和成绩,输出时if语句来控制,应该就可以了吧!
----------------解决方案--------------------------------------------------------

谢谢,不过你可能误解我的意思了,我的数据不是通过程序输入的,
是原来就有的,我写程序的目的就在于处理这些数据 ,如果数据很多
的话,通过一个个输入是解决不了问题的,再次感谢您的关注和帮助 !
不过我已经解决了,程序如下::
//================================================================
//程序名: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编辑过]


----------------解决方案--------------------------------------------------------
  相关解决方案