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