Read/Write C 文件结构

Read/Write structure to a file in C

我正在尝试合并结构和文件。所以,我想读取数据file.txt中结构的n个元素,可以有N条记录,(在我的例子中是日月年),然后操作这个数据,并将结果注册到另一个文件。你能帮我吗?我将不胜感激。这是我的代码

#include <stdio.h>


struct data{
    int d, m, y;
};


void readN(struct data element[],int n){
    FILE *data_file;
    data_file = fopen("data.txt","r");
    if(data_file == NULL){
        fprintf(stderr, "\n Error!!!");
    }
    else{
        while(!feof(data_file)){
            fscanf(data_file,"%d %d %d", &element->d, &element->m, &element->y);
        }
    }
}


int compareDates (struct data d1, struct data d2)
{

    if (d1.y < d2.y)
        return -1;
    else if (d1.y > d2.y)
        return 1;


    else if (d1.m < d2.m)
        return -1;
    else if (d1.m > d2.m)
        return 1;


    else if (d1.d < d2.d)
        return -1;
    else if (d1.d > d2.d)
        return 1;

    else
        return  0;

}

struct data checkMax(struct data *element, int n){
    struct data max = element[0];
    int i;
    for (i = 0; i < n; i++){
        if(compareDates(max,element[i]) == -1){
            max = element[i];
        }
    }
    return max;


}

struct data checkMin(struct data *element, int n) {
    struct data min = element[0];
    int i;
    for (i = 0; i < n; i++){
        if(compareDates(min,element[i]) == 1){
            min = element[i];
        }
    }
    return min;
}

int checkLeapYear(struct data yMax, struct data yMin){
    int counter = 0;

    for(int i = yMin.y; i <= yMax.y; i++ ){
        if((i % 4 == 0 && i % 100 != 0) || i % 400 == 0){
            counter++;
        }
    }
    return counter;

}



int main() {

   struct data dd1[4];
    readN(dd1,4);

    struct data maximum = checkMax(dd1,4);
    struct data minimum = checkMin(dd1,4);

    printf("\n Data maxima %d %d %d",maximum.d,maximum.m,maximum.y);
    printf("\n Data minima %d %d %d", minimum.d,minimum.m,minimum.y);
    printf("\n Nr de ani bisecti :  %d ", checkLeapYear(maximum,minimum));

    return 0;
}

data.txt

10 10 2001
1 1  2002
14 3 2004
18 4 2022

我的主机

Data maxima 6422280 1986752301 4201664
 Data minima 1986776256 2133694049 -2
 Nr de ani bisecti :  1018905
 Error!!!

readN() 只应该从文件中读取 n 行,因此它不会写入数组之外。您可以使用 for 循环来执行此操作。

您的代码重复读取数组的第一个元素,因为它从未递增 element。您可以使用循环的迭代变量作为数组索引。

在循环中,您应该检查 fscanf() 的 return 值以确保它能够读取所有项目。

void readN(struct data element[],int n){
    FILE *data_file;
    data_file = fopen("data.txt","r");
    if(data_file == NULL){
        fprintf(stderr, "Unable to open file\n");
        return;
    }
    for (int i = 0; i < n; i++) {
        if (fscanf(data_file,"%d %d %d", &element[i].d, &element[i].m, &element[i].y) != 3){
            fprintf(stderr, "Incomplete input!!!\n");
            break;
        }
    }
    fclose(data_file)
}