2012-02-27 60 views
0

我有一個.txt文件的學生的詳細信息。學生具體情況如下:鏈接列表和文件I/O

Std_no: 222 
Std_name: Dani 
Std_gender: M 

Std_no: 345 
Std_name: John 
Std_gender: M 

我所做的是我創建了一個包含成員的結構:

struct student 
{ 
    int Std_no; 
    char* Std_name; 
    Char* Std_gender; 
} 

我已經定義了一個鏈表,它指向(學生結構),使我可以在取回輸出時迭代它。

struct sstudent_elements 
    { 
     struct student *p 
     struct student_element *next; 
    } 

我想要實現的是能夠讀取.txt文件,將值分配給學生結構成員。感謝您的幫助&建議。如果我在做什麼有任何錯誤或問題,請隨時告訴我。

問候。

+5

什麼是您所遇到的具體問題? – 2012-02-27 23:29:12

+5

什麼讓你失望?打開文件閱讀?提取文本的正確部分?分配給結構?建立鏈表? – alex 2012-02-27 23:30:41

+2

這是功課嗎?如果是這樣,請標籤。 – jwddixon 2012-02-27 23:30:43

回答

0

這似乎是功課,你應該這樣標記它。

我建議閱讀fopen - 這將幫助您獲得一個FILE對象來訪問該文件,並閱讀關於如何使用fscanf的示例。請注意,scanf有點棘手,您可能會發現使用fgets獲取線和strchr或類似的調用來查找字段分隔符「手動」解析線更容易。

+0

謝謝。我如何標記帖子? – HShbib 2012-02-27 23:48:20

+0

在這種情況下,我會說'strtok'比'fscanf'好得多,因爲你知道文件將被換行符分割。 – 2012-02-27 23:51:54

+0

雖然strtok讓新手感到困惑 - 但API並不直觀。我傾向於告訴人們使用strchr並手動刪除分隔符... – Perry 2012-02-27 23:53:20

0

試試這個:

typedef struct 
{ 
    int Std_no; 
    char* Std_name; 
    char* Std_gender; 
} student; 

int parseStdNo(char *line) 
{ 
    return atoi(line + 8); 
} 

char *parseStdName(char *line) 
{ 
    return line + 10; 
} 

char *parseStdGender(char *line) 
{ 
    return line + 12; 
} 

int main() 
{ 
    char *fileLocation = "/path/to/my/file"; 
    FILE *file = fopen(fileLocation, "r"); 

    if (!file) 
    { 
     printf("%s\n", strerror(errno)); 
    } 

    // assume max file size of 1 kb, any more and you may consider malloc-ing your array 
    char buffer[1024]; 

    // assume max of 128 students, any more and you may consider malloc-ing your array 
    student students[128]; 

    if (fread(buffer, 1, sizeof(buffer), file)) 
    { 
     // buffer now contains our file data 
     char *line = strtok(buffer, "\n"); 
     int studentIndex = 0; 

     students[studentIndex].Std_no = parseStdNo(line); 

     // 0 is number, 1 is name, 2 is gender 
     int lineType = 1; 

     while ((line = strtok(NULL, "\n"))) 
     { 
      if (lineType == 3) 
      { 
       studentIndex++; 
       lineType = 0; 
      } 

      switch (lineType) { 
       case 0: 
       { 
        students[studentIndex].Std_no = parseStdNo(line); 
        break; 
       } 
       case 1: 
       { 
        students[studentIndex].Std_name = parseStdName(line); 
        break; 
       } 
       case 2: 
       { 
        students[studentIndex].Std_gender = parseStdGender(line); 
        break; 
       } 
      } 

      lineType++; 
     } 

     for (int i = 0; i <= studentIndex; i++) { 
      printf("student\n\tnumber %i\n\tname: %s\n\tgender: %s\n", students[i].Std_no, students[i].Std_name, students[i].Std_gender); 
     } 
    } 
    else { 
     printf("could not read from file\n"); 
    } 

    getchar(); 

    return 0; 
} 
+0

從[作業標籤](http://stackoverflow.com/tags/homework/info):「不要求'完整'的解決方案,我們不是在這裏爲你做功課。」 。 – 2012-02-28 00:03:04

+0

@OliCharlesworth我在添加標籤之前開始了我的回答 – 2012-02-28 00:24:55