#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct stCrimeArchive {
char id_student[10];
int id_document;
char judgement[30];
int id_crime;
char date[12];
char id_police[12];
};
int main()
{
struct stCrimeArchive *regi;
FILE *filea;
filea = fopen("crimearchives.dat", "r+b");
if(!filea)
filea = fopen("crimearchives.dat", "w+b");
int i;
char num[6];
regi = (struct stCrimeArchive*)malloc (sizeof(struct stCrimeArchive));
printf("ID DOCUMENT: ");
fgets(num, 6, stdin);
regi->id_document= atoi(num);
printf("ID STUDENT: ");
fgets(regi->id_student, 30, stdin);
for(i = strlen(regi->id_student)-1; i && regi->id_student[i] < ' '; i--)
regi->id_student[i] = 0;
printf("CRIME CODE: ");
fgets(num, 6, stdin);
regi->id_crime = atoi(num);
printf("DATE OF THE CRIME: ");
fgets(regi->date, 30, stdin);
for(i = strlen(regi->date)-1; i && regi->date[i] < ' '; i--)
regi->date[i] = 0;
printf("ID POLICE: ");
fgets(regi->id_police, 30, stdin);
for(i = strlen(regi->id_police)-1; i && regi->id_police[i] < ' '; i--)
regi->id_police[i] = 0;
printf("JUDGEMENT: ");
fgets(regi->judgement, 30, stdin);
for(i = strlen(regi->judgement)-1; i && regi->judgement[i] < ' '; i--)
regi->judgement[i] = 0;
fseek(filea, 0, SEEK_END);
fwrite(®i, sizeof(struct stCrimeArchive*), 1, filea);
free(regi);
fclose(filea);
}
上下文如下:我正在制作一个可变长度的文件,并且我正在使用上面显示的结构编写许多犯罪档案。为此,我需要为所涉及的结构做一个malloc。问题是当我把它写到文件时,它没有写任何东西,我不知道我在做什么错误。
我也想从同一个文件中阅读犯罪档案,但我也不知道我做错了什么。这是我正在尝试执行的操作的代码:
int main()
{
struct stCrimeArchive *regi;
regi = (struct stCrimeArchive*)malloc (sizeof(struct stCrimeArchive));
FILE *filea;
filea = fopen("crimearchives.dat", "r+b");
if(!filea)
filea = fopen("crimearchives.dat", "w+b");
rewind(filea);
while (fread(®i, sizeof(struct stCrimeArchive), 1, filea))
printf("%2d %-11s %-11s %8d %-13s %-14sn", regi->id_document, regi->id_police, regi->date, regi->id_crime, regi->id_student, regi->judgement);
fclose(filea);
}
如果我是你,我完全忘记使用malloc
,从你的例子。为此,您不需要动态内存分配。
struct CrimeArchive regi;
regi.id_student = 42;
/* do all your stuff here */
FILE* fp = fopen("crimearchives.dat", "wb");
if (fp != NULL) {
if (fwrite(®i, sizeof regi, 1, fp) != 1)
{ /* handle error */ }
fclose(fp);
}
当您从中阅读时相同:
struct CrimeArchive regi;
FILE* fp = fopen("crimearchives.dat", "rb");
if (fp != NULL) {
if (fread(®i, sizeof regi, 1, fp) != 1)
{ /* handle error */ }
fclose(fp);
}
请记住,如果文件在系统上写入并从另一个系统上读取,则不能保证将结构写入/从中读取
写入结构的大小,而不是指向结构的指针的大小。
fwrite(regi, sizeof(struct stCrimeArchive), 1, filea);
或者也许这会更清楚:
fwrite(regi, sizeof(*regi), 1, filea);
您的fwrite
调用是错误的:
fwrite(regi, sizeof(struct stCrimeArchive*), 1, filea);
将指针传递给要写入的内存是正确的,大小是指针的大小而不是要写入的实际struct
的大小是错误的。您可能只会将struct
开头的 4 或 8 个字节写入文件。
将sizeof(struct stCrimeArchive*)
更改为sizeof(struct stCrimeArchive)
,与传递给malloc
的大小相同。
但是,您的代码仍然无法编译,因为没有这样的stCrimeArchive
类型(应该CrimeArchive
?(,另一个原因是您尝试在以下行中为char[]
分配int
:
regi->id_student = atoi(num);
while (fread(®i, sizeof(struct CrimeArchive), 1, filea))
我认为这里的面包应该接受void*,但不能接受void**。
抱歉很晚才回答这个问题,但我想让知道问题是如何解决的。答案之一是正确的,问题是写结构的大小。
对于写作过程:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct stCrimeArchive {
char id_student[10];
int id_document;
char judgement[30];
int id_crime;
char date[12];
char id_police[12];
};
int main()
{
struct stCrimeArchive *regi;
FILE *filea;
filea = fopen("crimearchives.dat", "r+b");
if(!filea)
filea = fopen("crimearchives.dat", "w+b");
int i;
char num[6];
regi = (struct stCrimeArchive*)malloc (sizeof(struct stCrimeArchive));
printf("ID DOCUMENT: ");
fgets(num, 6, stdin);
regi->id_document= atoi(num);
printf("ID STUDENT: ");
fgets(regi->id_student, 30, stdin);
for(i = strlen(regi->id_student)-1; i && regi->id_student[i] < ' '; i--)
regi->id_student[i] = 0;
printf("CRIME CODE: ");
fgets(num, 6, stdin);
regi->id_crime = atoi(num);
printf("DATE OF THE CRIME: ");
fgets(regi->date, 30, stdin);
for(i = strlen(regi->date)-1; i && regi->date[i] < ' '; i--)
regi->date[i] = 0;
printf("ID POLICE: ");
fgets(regi->id_police, 30, stdin);
for(i = strlen(regi->id_police)-1; i && regi->id_police[i] < ' '; i--)
regi->id_police[i] = 0;
printf("JUDGEMENT: ");
fgets(regi->judgement, 30, stdin);
for(i = strlen(regi->judgement)-1; i && regi->judgement[i] < ' '; i--)
regi->judgement[i] = 0;
fseek(filea, 0, SEEK_END);
fwrite(regi, sizeof *regi, 1, filea);
free(regi);
fclose(filea);
}
然后,对于阅读过程:
int main()
{
struct stCrimeArchive *regi;
regi = (struct stCrimeArchive*)malloc (sizeof(struct stCrimeArchive));
FILE *filea;
filea = fopen("crimearchives.dat", "r+b");
if(!filea)
filea = fopen("crimearchives.dat", "w+b");
rewind(filea);
while (fread(regi, sizeof *regi, 1, filea))
printf("%2d %-11s %-11s %8d %-13s %-14sn", regi->id_document, regi->id_police, regi->date, regi->id_crime, regi->id_student, regi->judgement);
fclose(filea);
}
我没有什么可说的了,但谢谢=(