2013-03-25 34 views
-1

我正在維護計算機專業學生的集合的數據庫進行簡單的註冊系統。每個學生記錄包含從文件中讀取7個變量(每個變量1號線),並分配給結構變量

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

struct student 
{ 

    char name[300]; 
    int age; 
    char course_1[40]; 
    char course_2[40]; 
    char *remarks; 

}; 

struct course 

{ 

    char course_title[200]; 
    int cse_num[100]; 
    char instructor[200]; 
    char date[50]; 
    char start_time[50]; 
    char end_time[50]; 
    char location[50]; 

}; 


main() 

{ 

    int i; 
    struct course data[11]; 
    FILE *f; 
    char title[100]; 
    int num[100]; 
    char instructor[100]; 
    char date[100]; 
    char start_time[100]; 
    char end_time[100]; 
    char location[100]; 
    char line[300]; 

    f = fopen("course.dat", "r"); 


    i=0; 


    while(*fgets(line, 300, f) != '\n') 

    { 
     sscanf(line, "%99[^\n]", num); 
     sscanf(line, "%99[^\n]", title); 
     sscanf(line, "%99[^\n]", instructor); 
     sscanf(line, "%99[^\n]", date); 
     sscanf(line, "%99[^\n]", start_time); 
     sscanf(line, "%99[^\n]", end_time); 
     sscanf(line, "%99[^\n]", location); 

     data[i].cse_num = num // doesn't work 

     strcpy(data[i].course_title, title); 
     strcpy(data[i].instructor, instructor); 
     strcpy(data[i].date, date); 
     strcpy(data[i].start_time, start_time); 
     strcpy(data[i].end_time, end_time); 
     strcpy(data[i].location, location); 


     i++; 


    } 

    fclose(f); 


} 

我的問題是如何在輸入需要從文件,因爲它是7行,直到一個新行考慮。我盡我所能解釋這一點,謝謝你,如果你可以嘗試幫助我的傢伙!我真的專注於這一點,只是不能說實話。這是文件:

示例輸入:

CSE1001 
Research Directions in Computing 
Wildes, Richard 
W 
16:30 
17:30 
VC 135 
+0

我建議重新標記您的問題到c – apomene 2013-03-25 19:05:23

+0

1.你提供看起來並不像C#2可怕的格式(請您在使用橙色問號的代碼發佈以瞭解如何格式化)3.巨大的文本牆。不要發佈整個程序,不要發佈整個文件。發佈相關的代碼和簡要的輸入示例。 4.你還沒有自己嘗試過這個問題,但你或者 – tnw 2013-03-25 19:05:52

+0

你的代碼喜歡c,但你用c#來關閉它。你在說什麼語言? – evgenyl 2013-03-25 19:06:55

回答

1

不要忘了,你還必須strcpy(data[i].course_title, title);

而且也適用於所有字符串。

您目前正在做這件事:data[i].course_title = title;

+0

非常感謝!我試圖弄清楚爲什麼它早些時候給我一個錯誤。 – geforce 2013-03-25 19:38:49

0

考慮使用scanf。這是一個通用函數,用於解析來自終端或來自具有fscanf變體的文件的輸入。它已經是你將要包括的庫的一部分,並且格式與printf類似,你將使用很多的程序輸出。

+0

對於多字字符串(作業標題等),'fgets()'可能更好,雖然換行之前需要從字符串剪切換行符通過'strcpy()'。 – 2013-03-25 19:34:38

0

你誤報的main()

struct course 
{ 
    char course_title[200]; 
    int cse_num[100]; 
    char instructor[200]; 
    char date[50]; 
    char start_time[50]; 
    char end_time[50]; 
    char location[50]; 
} 

main() 
{ 

這是說main()返回struct course。這是錯誤的。

  1. 在結構後面添加一個分號。
  2. 始終爲每個函數提供顯式類型。 C99要求它;對於C89來說這是一個好習慣。

的代碼應該開始:

struct course 
{ 
    char course_title[200]; 
    int cse_num[100]; 
    char instructor[200]; 
    char date[50]; 
    char start_time[50]; 
    char end_time[50]; 
    char location[50]; 
}; 

int main(void) 
{ 

你應該從你的C編譯器對這個錯誤得到警告。如果你不是,你需要打開警告或者你需要一個更好的編譯器。

這可能與您面對的其他問題直接相關,但應該是固定的。

+0

嗨,我設置了早些時候..由於我剛剛參加這個論壇,它搞砸了。 – geforce 2013-03-25 19:39:20

+0

請注意'sscanf(line,「%s」,title);'只將'計算研究方向'中的'研究'這個單詞讀入標題。您需要將換行符修剪掉,並將其複製到結構中的「標題」中。同樣的教練名字。 (或者你可以使用'sscanf(line,「%99 [^ \ n]」,title)',它可以讀到一個換行符,只有99個字符值得避免緩衝區溢出。)你可以直接讀入結構體,避免一層複製:'sscanf(line,「%99 [^ \ n]」,data [i] .course_title);'。每次都應該檢查sscanf()操作是否成功。 – 2013-03-25 19:43:32

+0

非常感謝喬納森,我現在要試試這個。 – geforce 2013-03-25 19:52:09

相關問題