gpt4 book ai didi

c - 如何使用 write/fread 向结构数组写入/读取数据?

转载 作者:太空宇宙 更新时间:2023-11-04 03:49:01 24 4
gpt4 key购买 nike

我花了很多时间试图找到一个解决方案,如何在文件中写入和读取结构并完全卡住。

代码应该很简单,但我想我错过了关于fwrite/fread 的相当重要的细节。我认为 write 正在工作,但我不完全确定。一旦我尝试读入数组,我就会在 k=1 上遇到段错误。

如果有人能指导我朝哪个方向前进,我最终会很高兴。

#include <stdio.h>

struct Student {
char matrikl[6];
char shortName[6];
int value1;
int value2;
int value3;
int value4;
int money;
}xStudent;

int calcMoney(int,int,int,int);

int main(void)
{
int i=0;
printf("How much students to insert!\n");
scanf("%i",&i);
struct Student S[i];

for (int var = 0; var < i; ++var) {
printf("insert student data\n");
printf("Matriklinumber\n");
scanf("%s", S[var].matrikl);
printf("Student name\n");
scanf("%s", S[var].shortName);
printf("Insert values!\n");
scanf("%i%i%i%i",&S[var].value1,&S[var].value2,&S[var].value3,&S[var].value4);
S[var].money=calcMoney(S[var].value1,S[var].value2,S[var].value3,S[var].value4);;
}

FILE*sourcefile;
sourcefile=fopen("text.txt","ab+");

for (int var = 0; var < i; ++var) {
fwrite(&S[var],sizeof(struct Student),1,sourcefile);
}
fclose(sourcefile);


sourcefile=fopen("text.txt","rb+");
struct Student A[i];

if (sourcefile==NULL) perror ("Error opening file");
else
{
int k=0;
while (fgetc(sourcefile) != EOF) {
fread(&A[k],sizeof(struct Student),1,sourcefile);
k++;
}
}
fclose(sourcefile);
return 0;
}

int calcMoney(int xvalue1, int xvalue2, int xvalue3, int xvalue4)
{
int Sum = xvalue1+xvalue2+xvalue3+xvalue4;
if(Sum==20)
return 100;
else
if(Sum>=16 && Sum<20)
return 75;
else return 0;
}

最佳答案

您的想法是正确的,但这应该可以解决您的问题。

for (int var = 0; var < i; ++var) {
fwrite(&S[i], sizeof(struct Student), 1, sourcefile);
}

sizeof 语句之后的 fwrite 中的参数 1 表示您只想一次添加一个 Student。

请参阅fwrite 的文档:http://www.cplusplus.com/reference/cstdio/fwrite/

还有:

          while (fgetc(sourcefile) != EOF) {
fread(&A[k], sizeof(struct Student), 1, sourcefile);
k++;
}

请参阅fread 的文档:http://www.cplusplus.com/reference/cstdio/fread/

我知道这是 cplusplus 网站,但这是我唯一可以找到有关函数的好文档的地方。

此外,下面的数组初始化为 0 个元素:

struct Student A[k];

您可能想尝试为此管理链表。

可能最终看起来像这样:

struct StudentList {
struct Student* student;
struct StudentList* next;
};


struct StudentList* students = NULL;

while(!feof(sourcefile)) {
struct StudentList* newlink = malloc(sizeof(struct StudentList));
newlink->student = malloc(sizeof(struct Student));
newlink->next = NULL;

fread(newlink->student, sizeof(struct Student), 1, sourcefile);

if(NULL != students) {
struct StudentList* iter;
for(iter=students;
NULL != iter->next;
iter = iter->next); // iterate to last link

iter->next = newlink; // add new link to the end
} else students = newlink; // add new link to the beginning
}



然后释放你的列表,只需使用类似的东西:

struct StudentList* iter, *head;
for(iter=students;
NULL != iter;)
{
head = iter;
free(iter->student);
free(iter);
iter = head;
}

关于c - 如何使用 write/fread 向结构数组写入/读取数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22125950/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com