繁体   English   中英

将结构读/写到 C 中的文件

[英]Read/Write structure to a file in C

我正在尝试组合结构和文件。 所以,我想读取数据文件.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;
}

数据.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()的返回值以确保它能够读取所有项目。

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)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM