【发布时间】:2022-01-07 02:59:40
【问题描述】:
我有这个程序,我有一个结构,我必须从 file.txt 中保存一些日期(日-月-年)。 之后,我必须对其进行一些控制,例如可视化,按特定顺序可视化,ecc ... 我试图以升序可视化结构,因此从“最低”日期到“最高”日期。 我正在使用 qsort 函数,但是当我使用它时,它只是排序日期,而不是月份和年份。
我该如何解决这个问题? 我把代码放在这里。
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
struct date{ //<-- struct for the dates
int giorno;
int mese;
int anno;
};
struct date *leggi_file(FILE *fp, int *size){ //<-- im reading the file and saving the text in the struct
int dim = 16;
struct date *d;
if(!(d = malloc(dim *sizeof(struct date)))){
free(d);
return NULL;
}
char buf[60];
while(fgets(buf, sizeof(buf), fp) != NULL){
if(3 != sscanf(buf, "%d/%d/%d", &d[*size].giorno, &d[*size].mese, &d[*size].anno)){
puts("data incompleta");
continue;
}
(*size) = (*size) +1;
if(dim >= (*size)){
dim *= 2;
if(!(d = realloc (d, dim * sizeof(struct date))))
return 0;
}
}
d = realloc(d,(*size) * sizeof(struct date));
return d;
}
void stampafile(struct date *d, int size){ //<-- im printing on screen the file
int i;
for(i=0; i<size; i++){
printf("%d giorno %d mese %d anno\n", d[i].giorno, d[i].mese, d[i].anno);
}
}
int cmpfunc(const void *a, const void *b){
return (*(int*)a - *(int*)b);
}
void ordinadate(struct date *d, int size){
int i;
qsort(d, size, sizeof(*d), cmpfunc);
printf("\nqsort giorni\n");
for(i=0; i<size; i++){
printf("%d %d %d\n", d[i].giorno, d[i].mese, d[i].anno);
}
}
int main(int argc, char *argv[]){
struct date *d;
FILE *fp;
fp = fopen(argv[1],"r");
int size= 0;
if(fp == 0){
return 1;
}
if(!(d = leggi_file(fp, &size))){
return 0;
}
stampafile(d, size);
ordinadate(d, size); //function orderdate
fclose(fp);
free(d);
}
txt文件是这样的:
10/12/2012
10/11/2011
07/06/2001
...
【问题讨论】:
-
return (*(int*)a - *(int*)b);不知道为什么你认为转换为错误的类型是个好主意。将其转换为正确的struct date *并编写逻辑来比较年、月和日。