2016-03-18 50 views
1

私はCプログラミングが初めてです。私は、学生の詳細をリンクリスト(構造 "phbook"の形式)に入力し、リンクされたリストをテキストファイルに保存するための学生データベースを作成しました。私が働くことができない部分は、テキストファイルレコードをリンクリストに読み込むことです。プログラムを実行しますが、プログラムを終了して「外部ファイルから読み込む」を選択すると、リンクされたリストは更新されません。問題が何であるかを誰かに教えてください。私は "readFile"と "insertFull"関数をコーディングするまで、すべての作業を知っています。問題の原因となっている私に知らせてくださいC:構造体をリンクリストに読み込む(ファイルから)

#include <stdio.h> 
#include<string.h> 
#include<stdlib.h> 

struct phbook{ 
    int number; 
    char name[20]; 
    int mark; 
    struct part *next; 
}; 

struct phbook *list = NULL; 
struct phbook *find_student(int number); 
void insertFull(struct phbook* list, int number, char Name[10],int mark); 
int main(void) 
{ 
    int code; 
    int opt1; 
    int courses, i, k, j, counter; 
    for (;;){ 
     printf("Enter operation code: \n"); 
     printf("(1) ADD NEW STUDENT DETAILS: \n"); 
     printf("(2) SEARCH STUDENT DETAILS: \n"); 
     printf("(3) DISPLAY REPORT OF ALL STUDENTS: \n"); 
     printf("(4) SAVE ALL STUDENT RECORDS TO EXTERNAL FILE: \n"); 
     printf("(5) LOAD ALL STUDENT RECORDS FROM EXTERNAL FILE: \n"); 
     scanf(" %d", &code); 
    switch (code){ 
     case 1 : insert(); 
         break; 
     case 2 : search(); 
         break; 
      break; 
     case 3 : print(); 
      break; 
     case 4 : 
      saveToFile(); 
         break; 
        case 5 : 
      readFile(); 
         break; 
     default: printf("Illegal code\n"); 
} 
printf("\n"); 
} 
    } 


struct phbook *find_student(int number) 
{ 
    struct phbook *p; 
    for (p = list; p != NULL && number != p->number; p = p->next);//was sorted 
    if (p != NULL && number == p->number) 
     return p; 
     return NULL; 
} 

void insert(void) 
{ 
    struct phbook *cur; 
    struct phbook *prev; 
    struct phbook *new_node; 
    new_node = (struct phbook*) malloc(sizeof(struct phbook)); 
    if (new_node == NULL){ 
     printf("db full er1.\n"); 
     return; 
    } 
    printf("enter student id"); 
    scanf("%d", &new_node->number); 
    for (cur = list, prev = NULL; cur!= NULL && new_node->number > cur->number; prev = cur, cur = cur->next); 
    printf("Enter name: "); 
    scanf("%s", &new_node->name);//readline(new_node->name, NAME_LEN) 
    printf("Enter MARK: "); 
    scanf("%d", &new_node->mark); 

    new_node->next = cur; 
    if (prev == NULL) 
     list = new_node; 
    else 
     prev->next = new_node; 
} 

void search(void) 
{ 
    int number; 
    struct phbook *p; 
    printf("Enter ID: "); 
    scanf("%d", &number); 
    p = find_student(number); 
    if (p != NULL){ 
     printf("Name: %s\n", p->name); 
     printf("Marks: %d\n", p->mark); 
    } 
    else 
    printf("student not found.\n"); 
} 

void print(void) 
{ 
    struct phbook *p; 
    printf("Student_Number Student_Name Student_Mark\n"); 
    for (p = list; p != NULL; p = p->next) 
     printf("%7d %-25s %d\n", p->number, p->name, p->mark); 
} 
void saveToFile() 
{ 
    FILE* fp; 
    fp = fopen ("results.txt","w"); 


    struct phbook* curr = list;//he 
    while(curr!=NULL) 
    { 
    fprintf(fp,"%s\n", list->name); 
    fprintf(fp,"%d\n",curr->number); 
    fprintf(fp, "%d\n", curr->mark); 
     curr = curr->next; 
    } 
    fclose(fp); 
} 

void readFile() 
{ 
    FILE* fp; 
    if (!(fp = fopen ("results.txt", "r"))) 
     printf("File NOT Found"); 
    else{ 
     struct phbook *curr; 
     struct phbook *prev; 
     char TempName[10]; 
     int TempNumber; 
     int TempMark; 
     int done = 0; 
     int count = 0; 
     int success;//dummy 
     curr = list;//sets it to the head (first nde of ll) 
     if(list == NULL); 
     printf("List is null\n"); 

     if(curr == NULL) 
      printf("List is null\n"); 

     while (curr!=NULL) 
     { 
      curr = curr->next; 
     } 
     while (done == 0) 
     { 
      success = fscanf(fp, "%s", TempName); 
      if (success == 1) 
       { 
        success = fscanf(fp, "%d", &TempNumber); 
        if (success == 1) 
        { 
         success = fscanf(fp, "%d", &TempMark); 

         if(success == 1) 
         { 
          insertFull(list,TempNumber,TempName,TempMark); 
         } 
        } 

       } 
       else 
       { 
        done = 1; 
       } 

     } 
    } 
} 
void insertFull(struct phbook* list, int number, char Name[10],int mark) 
{ 
    struct phbook *cur; 
    struct phbook *prev; 
    struct phbook *new_node; 
    new_node = (struct phbook*) malloc(sizeof(struct phbook)); 
    if (new_node == NULL){ 
     printf("db full er1.\n"); 
     return; 
    } 

    for (cur = list, prev = NULL; cur!= NULL && new_node->number > cur->number; prev = cur, cur = cur->next); 
    new_node->number = number; 
    new_node->mark = mark; 
    strcpy(new_node->name,Name); 
    new_node->next = cur; 
    if (prev == NULL) 
     list = new_node; 
    else 
     prev->next = new_node; 


} 
+0

「= NULL」部分を削除するだけでしたか?私はあなたの友人が正しいと思う –

答えて

0

手順で

void insertFull(struct phbook* list, int number, char Name[10],int mark) 

あなたがあなたのローカルコピーを変更している。友達は、グローバル変数「のstruct phbook *リスト= NULLであることを私に言ってきました。リストには、これはグローバルな電話帳リストには影響を与えません

あなたは、このようにグローバル変数変更、引数リストからリストを削除することができます。

void insertFull(int number, char Name[10],int mark) 

これは厳密には良いプログラミングではありませんが、残りのコードと一致しています。

+0

私はそれがまだ動作しないことを行う – Saavin

+0

あなたは正しいことを確認しています – Saavin

関連する問題