そのため、何らかの理由で、古いデータの末尾に新しいファイルを追加して、データを格納する外部ファイル (.DAT) を作成する必要があります。
#include <stdio.h>
#include <stdlib.h>
int main () {
typedef struct {
char *Name;
int Index;
} DataFile;
static FILE *file;
size_t result;
DataFile *DataTable;
file = fopen("database.DAT","ab");
DataTable = (DataFile *) malloc (sizeof(DataFile));
DataTable[0].Name = "somefile.txt";
DataTable[0].Index = 7;
printf("%s %d \n",DataTable[0].Name,DataTable[0].Index);
result = fwrite(DataTable,sizeof(DataFile),1,file);
fclose(file);
free(DataTable);
return 0;
}
上記のコードを実行した後、データが正しく保存されているかどうかを確認します。というわけで、以下のコードを作成します。
#include <stdio.h>
#include <stdlib.h>
int main () {
typedef struct {
char *Name;
int Index;
} DataFile;
static FILE *file;
size_t result;
long size;
int i;
DataFile *DataTable;
file = fopen("database.DAT","rb");
if (file == NULL) printf("Error1");
// Determine the size of file
fseek(file,0,SEEK_END);
size = ftell(file);
rewind(file);
DataTable = (DataFile *) malloc ((size/sizeof(DataFile)) * sizeof(DataFile));
if (DataTable == NULL) printf("Error2");
result = fread(DataTable,sizeof(DataFile),size/sizeof(DataFile),file);
fclose(file);
for (i=0; i<result; i++) {
printf("%s %d \n",DataTable[i].Name,DataTable[i].Index);
}
free(DataTable);
return 0;
}
ただし、出力は得られます
somefile.txt 7
最初のコードブロックから
Error1 7
2 番目のコード ブロックから。問題は、.DAT ファイルを開くとき、または DataTable にメモリを割り当てるときに失敗したためではないことに気付きました。また、.DAT ファイルから読み取る場合、int 型 (Index) では機能しますが、char* 型 (Name) では機能しません。この char* 型の読み取りの問題 (および「error1」の原因) を解決するために何をすべきかわかりません。(グーグルでさえ私に答えをくれません。)