我正在尝试从文件读取的数据中删除重复数据,并将其存储在struct数组中,并将新的唯一值打印到文件中
我有一个带有x,y值和索引的文件,我已经从文件中读取了数据并将其存储在struct数组中,我想遍历该数组并最终删除重复的元素(x和y匹配)将新的唯一值打印到文件中。我正在读取的文件具有以下数据
我的目标是将文件读取到一个struct数组中,删除重复项并将其打印到另一个文件中。下面是我的代码
int store_fixation_point(FILE *fp,int id,struct fixation_point_type fixation_point[],int x, int y);
struct fixation_point_type {
int id_number;
int x;
int y;
};
int main()
{
int N_list,i,N,j;
int temp1 = 0;
float temp2, temp3;
int id_N0=0;
FILE *fp_in, *fp_out;
int fixation_number = 0, x =0, y=0;
char ch;
fixation_point_type fixationPoint [MAX_NUMBER_OF_POINTS];
fp_in = fopen("../data/input.txt", "r");
if (fp_in == NULL)
{
printf("Cannot open the input file \n");
exit(0);
}
fp_out = fopen("../data/output.txt", "w");
if (fp_out == NULL)
{
printf("Cannot open the output file \n");
exit(0);
}
fscanf(fp_in,"%d",&N_list);
i = 0;
do
{
i++;
N = 0;
temp2 = 0;
temp3 = 0;
do
{
if (fscanf(fp_in, "%d %f %f ", &temp1,&temp2,&temp3) != EOF){
if (temp2 == -1 && temp2 == -1)
{
break;
}
else
{
fixationPoint[N].id_number = temp1;
fixationPoint[N].x = temp2;
fixationPoint[N].y = temp3;
N++;
}
}
}while(1);
store_fixation_point(fp_out,N,fixationPoint,x,y);
fscanf(fp_in, "%d %d %d", &fixation_number, &x, &y);
N++;
for (j=0;j<N;j++)
{
printf("%3d %d %d\n",fixationPoint[j].id_number,(int)fixationPoint[j].x,(int)fixationPoint[j].y);
fprintf(fp_out,"%3d %d %d\n",fixationPoint[j].id_number,(int)fixationPoint[j].x,(int)fixationPoint[j].y);
}
printf("------------------------\n");
fprintf(fp_out,"------------------------\n");
}while(i<N_list);
fclose(fp_in);
fclose(fp_out);
return 0;
}
//function to remove duplicates
int store_fixation_point(FILE *fp,int indexID,struct fixation_point_type fixation_point[],int x, int y)
{
int i;
int a =0;
int index=0;
fixation_point_type temp[1000];
if(indexID == 0){
printf("%d %d %d\n",fixation_point[indexID].id_number, fixation_point[indexID].x,fixation_point[indexID].y);
}
else
{
for (i =0; i < indexID; i++){
if ( (fixation_point[i].x ==x) && (fixation_point[i].y==y) ){
a=a+1;
}
}
if (a==0)
{
printf("%d %d %d\n",fixation_point[indexID].id_number, fixation_point[indexID].x,fixation_point[indexID].y);
fprintf(fp,"%d %d %d \n",fixation_point[indexID].id_number, fixation_point[indexID].x,fixation_point[indexID].y);
}
return indexID;
我希望输出唯一值,例如
答案 0 :(得分:0)
将程序的各个部分分成单独的函数或过程是一个好主意。这样,每个都充当一个“黑匣子”,其行为被封装。第一个函数是{% url 'product-list' %}
,它将按成员比较两个结构。基于此基本功能,我们可以构建更大的功能cmp
,以删除重复项。
remDups
/* return 0 if structures are memberwise equal; false otherwise */
int cmp(const struct fixation_point_type *const a, const struct fixation_point_type *const b)
{
return (a->id_number == b->id_number && a->x == b->x && a->y == b->y);
}
/* removes duplicates in the array arr */
void remDups(struct fixation_point_type arr[], size_t n)
{
assert(n >= 0);
if (n < 2)
return;
size_t len = n;
while (--n > 0) {
/* if this elem. and the previous elem. are equal, shift elements beyond
arr[n] into its position */
if (cmp(arr[n], arr[n-1]) == 0)
memmove(arr + n - 1, arr + n, sizeof (*arr) * (len-n));
}
}
函数使用remDups
移动元素,覆盖重复元素。表达式memmove
是sizeof (*arr) * (len-n)
之后的元素中的字节数。