1
#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(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(&regi, sizeof(struct stCrimeArchive), 1, filea))
    printf("%2d %-11s %-11s %8d %-13s %-14s\n", regi->id_document, regi->id_police, regi->date, regi->id_crime, regi->id_student, regi->judgement);
   fclose(filea);
}
4

5 に答える 5

4

もし私があなただったら、あなたの例から、私は使用することをまったく忘れていたでしょうmalloc。このために動的メモリ割り当ては必要ありません。

struct CrimeArchive regi;
regi.id_student = 42;
/* do all your stuff here */

FILE* fp = fopen("crimearchives.dat", "wb");
if (fp != NULL) {
    if (fwrite(&regi, sizeof regi, 1, fp) != 1)
       { /* handle error */ }

    fclose(fp);
}

あなたがそれから読むときも同じです:

struct CrimeArchive regi;

FILE* fp = fopen("crimearchives.dat", "rb");
if (fp != NULL) {
   if (fread(&regi, sizeof regi, 1, fp) != 1)
       { /* handle error */ }

   fclose(fp);
}

また、ファイルがシステムで書き込まれ、別のシステムから読み取られる場合、このようなファイルへの構造体の書き込みとファイルからの構造体の読み取りは、移植性が保証されないことを忘れないでください。

于 2012-09-06T02:03:55.530 に答える
2

構造体へのポインタのサイズではなく、構造体のサイズを記述したい場合があります。

 fwrite(regi, sizeof(struct stCrimeArchive), 1, filea);

または多分これはより明確になるでしょう:

 fwrite(regi, sizeof(*regi), 1, filea);
于 2012-09-06T01:55:39.447 に答える
1

あなたのfwrite呼び出しは間違っています:

fwrite(regi, sizeof(struct stCrimeArchive*), 1, filea);

書き込むメモリにポインタを渡すのは正しいことです。サイズがポインタのサイズであり、実際structに書き込む予定のサイズではないのは間違いです。toファイルの先頭から4バイトまたは8バイトしか書き込んでいない可能性がありstructます。

に渡すのと同じサイズに変更sizeof(struct stCrimeArchive*)します。sizeof(struct stCrimeArchive)malloc

stCrimeArchiveただし、そのようなタイプがないため( ?) 、次の行でにをCrimeArchive割り当てようとしているという別の理由により、コードはまだコンパイルされません。intchar[]

regi->id_student = atoi(num);
于 2012-09-06T02:01:06.130 に答える
0

非常に遅く回答して申し訳ありませんが、問題がどのように解決されたかをお知らせしたいと思います。答えの1つは正しかった、問題は構造体のサイズを書くことでした。

書き込みプロセスの場合:

#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 %-14s\n", regi->id_document, regi->id_police, regi->date, regi->id_crime, regi->id_student, regi->judgement);
   fclose(filea);
}

私はこれ以上言うことはありませんが、感謝します=)

于 2012-09-13T12:13:59.960 に答える
0
while  (fread(&regi, sizeof(struct CrimeArchive), 1, filea))

ここでは、freadはvoid *を受け入れる必要がありますが、void**を受け入れるべきではないと思います。

于 2012-09-06T02:46:01.830 に答える