C语言文件排序问题
#include<stdio.h>#include<stdio.h>#include<stdlib.h>typedefstruct{charname[80];floats...
#include<stdio.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct {
char name[80];
float sc;
} stdinf;
int cmp(const void *a,const void *b)
{
return ((const stdinf*)b)->sc-((const stdinf *)a)->sc;
}
int main(void)
{
FILE *fp;
stdinf *sts=NULL;
int i,n;
if((fp = fopen("D:\\studentsortstart.txt", "r")) == NULL) // open file
{
printf("open studentsortstart file error\n");
return 0;
}
for (n = 0; !feof(fp); n++)
{ /*读取信息到sts数组*/
if (i)
{
sts=(stdinf*)realloc(sts,sizeof(stdinf)*(n+1));
}
else
{
sts=(stdinf*)malloc(sizeof(stdinf));
}
fscanf(fp,"%s %f",sts[n].name,&sts[n].sc);
}
fclose(fp);
qsort(sts,i,sizeof(stdinf),cmp); /*排序*/
if((fp = fopen("D:\\studentsortend.txt", "r")) == NULL) // open file
{
printf("open studentsortend file error\n");
return 0;
}
for (i = 0; i<n; i++)
{ /*写入有序信息*/
fprintf(fp,"%s %f\n",sts[i].name,sts[i].sc);
}
fclose(fp);
free(sts);
return 0;
}
以上代码到快速排序那就出错了,功能是读入指定目录下的学生信息文件,安学生成绩进行排序
例如 :wei 54
lijia 78
sunqiang 62
if (i)
{
sts=(stdinf*)realloc(sts,sizeof(stdinf)*(n+1));
}
else
{
sts=(stdinf*)malloc(sizeof(stdinf));
}是不是这块有问题啊,应该怎么改啊,高手指点下,realloc和malloc区别是什么啊,这块判断是什么意思啊? 展开
#include <stdio.h>
#include <stdlib.h>
typedef struct {
char name[80];
float sc;
} stdinf;
int cmp(const void *a,const void *b)
{
return ((const stdinf*)b)->sc-((const stdinf *)a)->sc;
}
int main(void)
{
FILE *fp;
stdinf *sts=NULL;
int i,n;
if((fp = fopen("D:\\studentsortstart.txt", "r")) == NULL) // open file
{
printf("open studentsortstart file error\n");
return 0;
}
for (n = 0; !feof(fp); n++)
{ /*读取信息到sts数组*/
if (i)
{
sts=(stdinf*)realloc(sts,sizeof(stdinf)*(n+1));
}
else
{
sts=(stdinf*)malloc(sizeof(stdinf));
}
fscanf(fp,"%s %f",sts[n].name,&sts[n].sc);
}
fclose(fp);
qsort(sts,i,sizeof(stdinf),cmp); /*排序*/
if((fp = fopen("D:\\studentsortend.txt", "r")) == NULL) // open file
{
printf("open studentsortend file error\n");
return 0;
}
for (i = 0; i<n; i++)
{ /*写入有序信息*/
fprintf(fp,"%s %f\n",sts[i].name,sts[i].sc);
}
fclose(fp);
free(sts);
return 0;
}
以上代码到快速排序那就出错了,功能是读入指定目录下的学生信息文件,安学生成绩进行排序
例如 :wei 54
lijia 78
sunqiang 62
if (i)
{
sts=(stdinf*)realloc(sts,sizeof(stdinf)*(n+1));
}
else
{
sts=(stdinf*)malloc(sizeof(stdinf));
}是不是这块有问题啊,应该怎么改啊,高手指点下,realloc和malloc区别是什么啊,这块判断是什么意思啊? 展开
1个回答
展开全部
malloc是分配内存函数,会分配一片连续空间,函数会返回连续空间的首地址。
realloc是重新分配内存函数,主要是用于在原来分配好的基本上,想要增加5个int空间时用。
比如:
int *a;
a=malloc(10*sizeof(int));
作用是分配十个整型数空间,首地址赋予a。效果同
int a[10];
是一样的。如果程序运行过程中发现10个空间不够了,需要增加空间,就可以用
a=realloc(a,15*sizeof(int));
意思就是重新分配15个整型数空间,然后把数组a里面的内容转移到这15个整型数空间里去,最后把这片连续空间的首地址赋予a。这样的话,就完成了增加空间的需要。
qsort快排函数的cmp函数你写错了,cmp的返回值只能是int型,不能是float等其它类型。cmp函数应该改为
int cmp(const void *a,const void *b)
{
if(((const stdinf*)b)->sc-((const stdinf *)a)->sc>0)
return -1;
else return 1;
}
关于qsort的应用举例,你可以参考一下:http://www.examda.com/ncre2/cpp/fudao/20071021/091331271.html
例子简单明了.
程序中还有一些其他的小错误。
总体的修改过后的源代码如下:
#include<stdio.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct {
char name[80];
float sc;
} stdinf;
int cmp(const void *a,const void *b)
{
if(((const stdinf*)b)->sc-((const stdinf *)a)->sc>0)
return -1;
else return 1;
}
int main(void)
{
FILE *fp;
stdinf *sts=NULL;
int i=0,n;
if((fp = fopen("d:\\studentsortstart.txt","r"))==NULL) // open file
{
printf("open studentsortstart file error\n");
return 0;
}
for (n = 0; !feof(fp); n++)
{ /*读取信息到sts数组*/
if (i)
{
sts=(stdinf*)realloc(sts,sizeof(stdinf)*(n+1)); //增加分配空间
}
else //设置初始时分配一个空间,后面均以增量式分配
{
sts=(stdinf*)malloc(sizeof(stdinf)); //分配一个空间,地址赋予sts
}
fscanf(fp,"%s %f",sts[n].name,&sts[n].sc);
i++;
}
i--;
n--;
fclose(fp);
qsort(sts,i,sizeof(stdinf),cmp); /*排序*/
if((fp = fopen("D:\\read.txt", "w")) == NULL) // open file
{
printf("open studentsortend file error\n");
return 0;
}
for (i = 0; i<n; i++)
{ /*写入有序信息*/
fprintf(fp,"%s %f\n",sts[i].name,sts[i].sc);
}
fclose(fp);
free(sts);
return 0;
}
realloc是重新分配内存函数,主要是用于在原来分配好的基本上,想要增加5个int空间时用。
比如:
int *a;
a=malloc(10*sizeof(int));
作用是分配十个整型数空间,首地址赋予a。效果同
int a[10];
是一样的。如果程序运行过程中发现10个空间不够了,需要增加空间,就可以用
a=realloc(a,15*sizeof(int));
意思就是重新分配15个整型数空间,然后把数组a里面的内容转移到这15个整型数空间里去,最后把这片连续空间的首地址赋予a。这样的话,就完成了增加空间的需要。
qsort快排函数的cmp函数你写错了,cmp的返回值只能是int型,不能是float等其它类型。cmp函数应该改为
int cmp(const void *a,const void *b)
{
if(((const stdinf*)b)->sc-((const stdinf *)a)->sc>0)
return -1;
else return 1;
}
关于qsort的应用举例,你可以参考一下:http://www.examda.com/ncre2/cpp/fudao/20071021/091331271.html
例子简单明了.
程序中还有一些其他的小错误。
总体的修改过后的源代码如下:
#include<stdio.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct {
char name[80];
float sc;
} stdinf;
int cmp(const void *a,const void *b)
{
if(((const stdinf*)b)->sc-((const stdinf *)a)->sc>0)
return -1;
else return 1;
}
int main(void)
{
FILE *fp;
stdinf *sts=NULL;
int i=0,n;
if((fp = fopen("d:\\studentsortstart.txt","r"))==NULL) // open file
{
printf("open studentsortstart file error\n");
return 0;
}
for (n = 0; !feof(fp); n++)
{ /*读取信息到sts数组*/
if (i)
{
sts=(stdinf*)realloc(sts,sizeof(stdinf)*(n+1)); //增加分配空间
}
else //设置初始时分配一个空间,后面均以增量式分配
{
sts=(stdinf*)malloc(sizeof(stdinf)); //分配一个空间,地址赋予sts
}
fscanf(fp,"%s %f",sts[n].name,&sts[n].sc);
i++;
}
i--;
n--;
fclose(fp);
qsort(sts,i,sizeof(stdinf),cmp); /*排序*/
if((fp = fopen("D:\\read.txt", "w")) == NULL) // open file
{
printf("open studentsortend file error\n");
return 0;
}
for (i = 0; i<n; i++)
{ /*写入有序信息*/
fprintf(fp,"%s %f\n",sts[i].name,sts[i].sc);
}
fclose(fp);
free(sts);
return 0;
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询