データベースの作成
Posted: 2013年6月05日(水) 22:18
大学の課題でデータベースを作るというものが出されました。
以下が課題の要約です。
実装する機能は、登録、訂正、削除、検索。
テキストファイルへの保存、読み込みの機能を実装する。
テキストファイルの形式は
<検索キー>,<検索対象データ>
のように半角カンマで区切り、読み込みファイルに形式エラーはないとしてよい。
以下が私の作ったプログラムです。
私の考えていた動作は、
最初にテキストファイルを読み込んで、テキストファイルの中にあるデータをリストに書きこんでいく。
データを登録する場合、先ほど書きこんだリストの続きに新たなリストを作りそこへ新しいデータを入れる。
テキストファイルが空の場合は先頭のリストに直接名前と得点を入れる。
最後にリストのデータをすべてテキストファイルに上書きする。
しかしわたしのプログラムを実行すると以下のようになりました。
text.txtに何も文字が入っていない場合。
$ ./a.exe text.txt
何を実行しますか?
1.登録
2.訂正
3.削除
4.検索
番号を入力してください。
1
名前をを入力してください。
A
得点を入力してください。
50
名前
A
得点
50
で登録しました。
と出力されたのですが、text.txtには何も書きこまれておらず、空のままでした。
text.txt
A,30
という文字が入っていた場合
$ ./a.exe text.txt
何を実行しますか?
1.登録
2.訂正
3.削除
4.検索
番号を入力してください。
1
名前をを入力してください。
B
得点を入力してください。
40
名前A,30得点
で登録しました。
としゅつりょくされ、text.txtの中身は
A,30,
とカンマが1つ増えていました。
なぜ思い通りに動かないのかがわかりません。
プログラムのおかしな場所を教えてほしいです。
よろしくお願いします。
以下が課題の要約です。
実装する機能は、登録、訂正、削除、検索。
テキストファイルへの保存、読み込みの機能を実装する。
テキストファイルの形式は
<検索キー>,<検索対象データ>
のように半角カンマで区切り、読み込みファイルに形式エラーはないとしてよい。
以下が私の作ったプログラムです。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct lst {
struct lst *next;
char name[20];
char score[20];
}LIST;
LIST *newList(LIST *start, char *string1, char *string2){
LIST *p=start;
LIST *new;
while(p->next!=NULL){
p=p->next;
}
if((new = (LIST *)malloc(sizeof(LIST)))==NULL){
fprintf(stderr,"Can't allocate memory!\n");
exit(-1);
}
p->next = new;
strcpy(new->name, string1);
strcpy(new->score, string2);
new->next = NULL;
return new;
}
void printregister(LIST *init){
LIST *p=init;
if(p==NULL){
printf("LIST IS EMPTY\n");
exit(1);
}
printf("名前%s得点\n%s\nで登録しました。\n",p->name,p->score);
}
void writefile(LIST *p)
{
FILE *fp;
if((fp = fopen("text.txt", "w")) == NULL){
printf("file open error!!\n");
exit(1);
}
while(p->next!=NULL){
fputs(p->name, fp);
putc(',', fp);
fputs(p->score,fp);
putc('\n',fp);
p=p->next;
}
}
void inputdate(LIST *init){
LIST *p=init;
int i=0;
int j=0;
char n[20];
char s[20];
printf("名前をを入力してください。\n");
while( ( n[i++] = getchar() ) != EOF) ;
n[i-1] = '\0';
printf("得点を入力してください。\n");
while( ( s[j++] = getchar() ) != EOF) ;
s[j-1] = '\0';
if(p->name[0]=='\0'){
strcpy(p->name,n);
strcpy(p->score,s);
}
else{
newList(p,n,s);
}
writefile(p);
printregister(p);
}
void readfile(FILE *fp, LIST *init)
{
LIST *p = init;
while((fscanf(fp,"%s%d",p->name,p->score))!=EOF){
p=p->next;
}
}
int main (int argc, char *argv[])
{
LIST *init;
FILE *fp;
int num;
if((init = (LIST*)malloc(sizeof(LIST)))==NULL){
fprintf(stderr,"Can't allocate memory!\n");
exit(-1);
}
if(argc >1){
if((fp = fopen(argv[1], "r")) == NULL){
printf("file open error!!\n");
exit(1);
}
}
readfile(fp,init);
fclose (fp);
printf("何を実行しますか?\n");
printf("1.登録\n");
printf("2.訂正\n");
printf("3.削除\n");
printf("4.検索\n");
printf("番号を入力してください。\n");
scanf("%d",&num);
switch(num){
case 1:
inputdate(init);
}
}
最初にテキストファイルを読み込んで、テキストファイルの中にあるデータをリストに書きこんでいく。
データを登録する場合、先ほど書きこんだリストの続きに新たなリストを作りそこへ新しいデータを入れる。
テキストファイルが空の場合は先頭のリストに直接名前と得点を入れる。
最後にリストのデータをすべてテキストファイルに上書きする。
しかしわたしのプログラムを実行すると以下のようになりました。
text.txtに何も文字が入っていない場合。
$ ./a.exe text.txt
何を実行しますか?
1.登録
2.訂正
3.削除
4.検索
番号を入力してください。
1
名前をを入力してください。
A
得点を入力してください。
50
名前
A
得点
50
で登録しました。
と出力されたのですが、text.txtには何も書きこまれておらず、空のままでした。
text.txt
A,30
という文字が入っていた場合
$ ./a.exe text.txt
何を実行しますか?
1.登録
2.訂正
3.削除
4.検索
番号を入力してください。
1
名前をを入力してください。
B
得点を入力してください。
40
名前A,30得点
で登録しました。
としゅつりょくされ、text.txtの中身は
A,30,
とカンマが1つ増えていました。
なぜ思い通りに動かないのかがわかりません。
プログラムのおかしな場所を教えてほしいです。
よろしくお願いします。