2012-02-27 48 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