2016-03-18 31 views
1

Programlamada yeniyim. Programımda öğrencileri depolamak için bir veritabanı yapmam gerekiyor. Program, bağlantılı listede işaretler, kimlik, isim ve depo (yapı olarak) girmesine izin vermeli ve aynı zamanda dosya içinde saklanmalı ve ayrıca dosyadan bağlantılı listeye okunmalıdır. Sahip olduğum tek sorun, .exe programını kapattığımda ve .txt dosyasından bağlantılı listeye okumayı seçtiğimde çalışmam. Kodu derlediğimde hata çıkmadı, ancak SONRASINDA TÜM ÖĞRENCİLERİN GÖRÜNTÜ EKRANI'nı seçtiğimde hiçbir kayıt gösterilmiyor. Bu küçük bir problem, lütfen bunu nasıl düzelteceğinizi önerin.txt dosyasını (yapıları içeren) bağlı listeye kopyalama c

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

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

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

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

int main(void) 
{ 
    struct phbook *list = NULL; 
    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: 
       list = insert(list); 
       break; 
      case 2: //search(); 
       break; 
       break; 
      case 3: 
       print(list); 
       break; 
      case 4: 
       saveToFile(list); 
       break; 
      case 5: 
       readFile(list); 
       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; 
}*/ 

struct phbook* insert(struct phbook *list) 
{ 

    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 NULL; 
    } 
    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; 

    return list; 
} 

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(struct phbook *list) 
{ 
    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(struct phbook *list) 
{ 
    FILE* fp; 
    fp = fopen("results.txt", "w"); 

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

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

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

     while (cur != NULL) 
     { 
      cur = cur->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; 
      } 
     } 
    } 
} 

struct phbook* 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; 
    return list; 
} 

ekran görüntüsü şudur: şu şekildedir:

Benim kodudur buraya geldiğimde

ekran görüntüsü zaten MIA oldu - user4581301

+0

bazı küçük kodlama hataları düzeltildi eksik prototipler

eklendi, bu yüzden kod biçimlendirilmiş zaman C+++ etiketi kaldırıldı . Yine de ekran görüntüsünün nerede olduğu hakkında bir ipucu yok. – user4581301

+0

bize ne bildiğini anlat. Giriş/yazma çalışıp çalışmadığını görmek için çıktı dosyasını bir editörle açtın mı? İşte bir ipucu; Ekleme işleminden veri girişini ayırın. Artık kullanıcı girişine ihtiyaç duymayan test koduyla ekleme işlemini test edebilirsiniz. bilinen değerlere sahip bir veya daha fazla eki arayabilirsiniz. operasyonunu test etmek için. –

+0

Derleyici uyarılarınızı kontrol edin. Yapmazsan birkaç kötü sürprizin var. Örneğin, 'insertFull', hiçbir şey döndürmeyen bir dönüşe sahiptir. Bu davayı yürütürseniz program yanlış davranacaktır. – user4581301

cevap

1

olacak ana liste Başvurunuz yürütmek durumunda boş ol.

Daha sonra readFile() numaralı telefonu aradığınızda, listeyi ana sayfada güncelleştirmeyeceksiniz. İşaretçiyi değere göre iletirsiniz, böylece bu işlevin yerel parametresini güncellersiniz. Bu arada, insertFull() numaralı çağrı neredeyse aynı soruna sahiptir: ekleme işlemini takip eden listeyi döndürür, ancak bu dönüşü dikkate almazsınız.

Değişim bu iki işlev sen insert() için ne gibi her ikisi de, listesini döndürür, böylece:

struct phbook* readFile(struct phbook* list) 
{ 
    ... 
      list = insertFull(list, TempNumber, TempName, TempMark); 
    ... 
    return list; 
} 

ve tabii menüsü kullanımına başında fonksiyon prototip adapte ve güncelleme:

find_student() com:
 case 5: 
      list = readFile(list); 
      break; 
+0

@chrstophe olarak değiştirmeyi önerdiğinizde, geri bildirim listesine tam olarak girebilmem için – Saavin

+0

numaralı bu geri bildirim için teşekkür ederiz; – Saavin

+1

Geri dönüşü, her zaman bir liste döndüreceğinden emin olmak için. – Christophe

0

aşağıdaki kod işlevi nedeniyle yönlendirilmezsiniz Ancak temiz

derler dışarı atıldı.

Kodun incelenmesi, istenen tüm işlevleri tam olarak yerine getirmeyeceğini gösterir. Yani hala yürütme hata ayıklamak zorunda kalacaksınız.

bunu yapmak zorunda kalacak yüzden, gerekli tüm hata denetimi eklemek vermedi gdb

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

#define MAX_NAME_LEN (20) 

struct phbook 
{ 
    int studentID; 
    char studentName[ MAX_NAME_LEN ]; 
    int studentGrade; 
    struct phbook *next; 
}; 

// prototypes 
struct phbook* insert(struct phbook*); 
struct phbook* find_student(int); 
void insertFull(struct phbook*, int, char *, int); 
void readFile (struct phbook*); 
void print  (struct phbook*); 
void saveToFile(struct phbook*); 


int main(void) 
{ 
    struct phbook *list = NULL; 
    int code; 

    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: 
       list = insert(list); 
       break; 

      case 2: //search(); 
       break; 
       break; 

      case 3: 
       print(list); 
       break; 

      case 4: 
       saveToFile(list); 
       break; 

      case 5: 
       readFile(list); 
       break; 

      default: 
       printf("Illegal code\n"); 
     } // end switch 

     printf("\n"); 
    } // end for() 
} // end function: main 


#if 0 
struct phbook *find_student(int studentID) 
{ 
    struct phbook *p; 
    for (p = list; p != NULL && studentID != p->studentID; p = p->next);//was sorted 

    return p; 
} // end function: find_student 
#endif 


struct phbook* insert(struct phbook *list) 
{ 
    struct phbook *cur; 
    struct phbook *prev; 
    struct phbook *new_node; 

    if(NULL == (new_node = malloc(sizeof(struct phbook)))) 
    { 
     perror("malloc for struct phbook failed"); 
     return NULL; 
    } 

    // implied else malloc successful 

    printf("enter student id"); 
    scanf("%d", &new_node->studentID); 

    for (cur = list, prev = NULL; 
     cur != NULL && new_node->studentID > cur->studentID; 
     prev = cur, cur = cur->next) 
    { 
     ; 
    } 

    printf("Enter studentName: "); 
    scanf("%19s", new_node->studentName); //readline(new_node->studentName, NAME_LEN) 

    printf("Enter MARK: "); 
    scanf("%d", &new_node->studentGrade); 

    new_node->next = cur; 

    if (!prev) 
    { 
     list = new_node; 
    } 

    else 
    { 
     prev->next = new_node; 
    } 

    return list; 
} // end function: search 


void search(void) 
{ 
    int studentID; 
    struct phbook *p; 
    printf("Enter ID: "); 
    scanf("%d", &studentID); 

    if(NULL == (p = find_student(studentID))) 
    { 
     printf("studentName: %s\n", p->studentName); 
     printf("Marks: %d\n", p->studentGrade); 
    } 

    else 
    { 
     printf("student not found.\n"); 
    } 
} // end function: search 


void print(struct phbook *list) 
{ 
    struct phbook *p; 
    printf("Student_Number Student_studentName Student_Mark\n"); 
    for (p = list; p != NULL; p = p->next) 
     printf("%7d %-25s %d\n", p->studentID, p->studentName, p->studentGrade); 
} // end function: print 


void saveToFile(struct phbook *list) 
{ 
    FILE* fp; 
    fp = fopen("results.txt", "w"); 

    struct phbook* cur = list; //he 
    while (cur != NULL) 
    { 
     fprintf(fp, "%s\n", list->studentName); 
     fprintf(fp, "%d\n", cur->studentID); 
     fprintf(fp, "%d\n", cur->studentGrade); 
     cur = cur->next; 
    } 
    fclose(fp); 
} // end function: saveToFile 


void readFile(struct phbook* list) 
{ 
    FILE* fp = NULL; 
    if (!(fp = fopen("results.txt", "r"))) 
    { 
     perror("fopen for read of results.txt failed"); 
     return; 
    } 

    //implied else, fopen successful 

    char TempstudentName[10]; 
    int TempNumber; 
    int TempMark; 

    while (3 == fscanf(fp, " %19s %d %d", TempstudentName, &TempNumber, &TempMark)) 
    { 
     insertFull(list, TempNumber, TempstudentName, TempMark); 
    } 
} // end function; readFile 


void insertFull(struct phbook* list, 
          int studentID, 
          char studentName[10], 
          int studentGrade) 
{ 
    struct phbook *cur; 
    struct phbook *prev; 
    struct phbook *new_node; 

    if(NULL == (new_node = malloc(sizeof(struct phbook)))) 
    { 
     perror("malloc for size of struct phbook failed"); 
     return; 
    } 

    for (cur = list, prev = NULL; 
     cur != NULL && new_node->studentID > cur->studentID; 
     prev = cur, cur = cur->next) 
    { 
     ; 
    } 

    new_node->studentID = studentID; 
    new_node->studentGrade = studentGrade; 
    strcpy(new_node->studentName, studentName); 
    new_node->next = cur; 

    if (!prev) 
    { 
     list = new_node; 
    } 

    else 
    { 
     prev->next = new_node; 
    } 
} // end function: insertFull 

gibi bir debugger kullanarak öner.

ben İnsanların std :: string` `kullanmak söylemeni istemiyorum

İlgili konular