链接列表和文件I / O.

时间:2012-02-27 23:27:38

标签: c

我有一个学生详细信息的.txt文件。学生详情如下:

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文件,将值分配给学生结构成员。感谢您的帮助&建议。如果我正在做的任何错误或问题,请随时告诉我。

的问候。

2 个答案:

答案 0 :(得分:0)

这似乎是作业,你应该这样标记。

我建议阅读fopen - 这将有助于您获取FILE对象来访问该文件,并阅读有关如何使用fscanf的示例。请注意,scanf有点棘手,您可能会发现使用fgets“手动”解析行更容易获取行和strchr或类似的调用来查找字段分隔符。

答案 1 :(得分: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;
}