2016-03-18 30 views
1

C programlamada yeniyim. Öğrenci detaylarını bağlantılı bir listeye ("phbook" yapısı şeklinde) girmek ve bağlantılı listeyi metin dosyasına kaydetmek için bir öğrenci veritabanı oluşturdum. Çalışamadığım bölüm, metin dosyası kayıtlarını bağlantılı listeye okumaktır. Program çalışıyor, ancak programı kapattığımda bağlı listeyi güncellemiyor, ardından "HARİCİ DOSYAN YÜKLE" seçeneğini seçin. Lütfen sorunun ne olduğunu anlamaya yardım edin. Ben "readFile" ve "insertFull" işlevini kodlayana kadar çalışılan herşeyi biliyorum. Soruna neden olan bana bildirinC: Bağlantı Listesine Yapıyı Oku (Dosyadan)

#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" bölümünü kaldırmayı denediniz mi? Ben hala –

cevap

0

prosedürde

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

Eğer yerel kopyasını değişiyor; Arkadaş küresel değişkeni "struct phbook * list = NULL olduğunu söylediler.. liste, bu küresel telefon defteri listesinde herhangi bir etkisi yoktur

böylece küresel değişkeni değiştirerek argüman listelerinden listeyi kaldırabilirsiniz:.

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

Bu kesinlikle iyi bir programlama değildir, ancak kodunuzun geri kalanıyla uyumludur.

+0

arkadaşların doğru olduğunu düşünüyorum Ben hala işe yaramazsa – Saavin

+0

doğru olduğuna emin misin – Saavin