|
2件目にデータを入力したときにファイルに出力した
ダミーノードのデータが消えてしまいます。
fopenのモードが悪いのでしょうか?
アドバイスのほどよろしくお願いいたします。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define END -1
struct node{
long int bango;
char name[20];
char denwa[15];
long int next;
}NODE;
struct node *head;
FILE *fpbin, *fpcsv; /*FILE構造体(グローバル変数)*/
struct node *memalloc(void);
void file_list_insert(long int bango,struct node *);
void file_list_append(struct node*, char *);
int file_list_delete(long int bango);
void file_list_display(void);
void main(int argc, char **argv)
{
struct node seiseki;
int kubun;
struct node *p;
int cnt;
if (argc != 2){
printf("コマンドライン引数に誤りがあります。\n");
printf("Usage:a.out filename1 \n");
exit(EXIT_FAILURE);
}
head = memalloc();
head -> next = END;
fpbin = fopen(argv[1],"w+b");
fwrite(head, sizeof(struct node),1,fpbin);
fclose(fpbin);
while(printf("処理区分を入力してください(1:挿入 2:追加 3:削除 4:表示 5:処理終了(表示))→"),scanf("%d", &kubun)){
switch(kubun){
case 1:
printf("case1\n");
case 2:
p = memalloc();
printf("追加するNo 名前 tel >");
scanf("%ld %s %s", &p -> bango, p -> name, p -> denwa);
file_list_append(p,argv[1]);
break;
case 3:
printf("case1\n");
//file_list_display();
default:
printf("default\n");
if((fpbin = fopen(argv[1],"rb")) == NULL){
printf("error\n");
exit(1);
}
fread(&seiseki,sizeof(struct node),1,fpbin);
printf("seiseki.next = %ld\n", seiseki.next);
while(fseek(fpbin, seiseki.next, SEEK_SET) != 0){
if(fread(&seiseki,sizeof(struct node),1,fpbin) != NULL)
break;
printf("seiseki.bango = %ld seiseki.name = %s seiseki.denwa = %s seiseki.next = %ld\n",seiseki.bango, seiseki.name, seiseki.denwa, seiseki.next);
}
fclose(fpbin);
}
}
}
struct node *memalloc(void)
{
struct node *p;
if ( (p = (struct node *)malloc(sizeof(struct node))) != NULL ){
return p;
}
printf("メモリの動的割当に失敗しました。\n");
exit (1);
return p;
}
void file_list_append(struct node *p, char *filename)
{
struct node seiseki;/*ファイルに格納されている構造体(レコード)*/
long int position;
int cnt = 0;
fpbin = fopen(filename,"rb");
position = ftell(fpbin);
fread(&seiseki,sizeof(struct node),1,fpbin);
while(seiseki.next != END){
fseek(fpbin, seiseki.next, SEEK_SET);
printf("seiseki.next = %ld\n", seiseki.next);
position = ftell(fpbin);
fread(&seiseki,sizeof(struct node),1,fpbin);
cnt++;
if(cnt == 2)
exit(1);
printf("seiseki.name = %s\n", seiseki.name);
}
seiseki.next = ftell(fpbin);
fclose(fpbin);
fpbin = fopen(filename,"wb");
fseek(fpbin,position,SEEK_SET);
fwrite(&seiseki, sizeof(struct node),1,fpbin);
fseek(fpbin,seiseki.next,SEEK_SET);
p -> next = END;
fwrite(p, sizeof(struct node),1,fpbin);
fclose(fpbin);
}
|