从文本文件中解析输入数据

时间:2014-07-09 00:28:55

标签: c

我需要做的是使用以下数据打开文件进行阅读。我已经完成了打开文件所做的一切,但我仍然坚持我需要对信息进行标记化并将其添加到结构数组中的部分。输入数据如下所示:

John is enrolled in MATH 1426.
Peter is enrolled in SCI 1441.
John is enrolled in PHYS 1201.

这就是我的struct看起来我需要将数据读入:

struct classes {
  char name[20];
  char department[4];
  int course_number[4];
};

这是我在上面struct打开和阅读文件的代码:

int main(void)
{
  FILE *file;
  char buffer[50];
  char line[50];
  struct classes student;    

  file = fopen("inputfile.txt", "r");

  while (fgets(buffer, sizeof(buffer), fp))
  {
     tokenize = strtok(buffer, " ");
     strcpy(line, tokenize);
     while(tokenize != NULL)
     {
        token = strtok(NULL, " ");
        switch(i)
        {
          case 3: strcpy(student.department, token);
             break;
          case 5: student.course_number = atoi(token);
        }
     }
     i++;
  }
  i=0;
}

我在这里要做的是将数据标记为一个结构数组,但它不起作用。我做错了什么?

3 个答案:

答案 0 :(得分:0)

到目前为止,您提供的代码仅显示了构建结构的尝试。

对于字符串,您需要在结尾处为空字符留出空间。

  • department和course_number需要更大

你的strtok代币是不起作用的,因为你需要坚持下去" "不是" "

您需要获取strtok的第1,第5和第6次迭代,并将它们放入结构中的相应字段:名称,部门和课程编号。

答案 1 :(得分:0)

一些问题:

1)department有4个元素,这意味着如果部门名称有4个字符,则没有终止空的空间。

2)course_number被声明为int所以它不需要是一个数组。

3)但是,您必须使用atoisscanf或类似内容将课程编号转换为int。

4)student只是一个单一的实例,而不是一个结构数组,因为它需要包含多个学生。

5)当您的外部循环终止时,line将包含名称“John”,student.name将包含文本“1201”,而student.department将包含垃圾,student.course_number将包含{1}}。

解决这五个问题,你将有一个工作程序。

答案 2 :(得分:0)

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

struct classes {
    char name[20];
    char department[5];//+1 for '\0'
    int course_number;
};

int main(void){
    FILE *file;
    char buffer[50];
    struct classes student, students[48];
    int i, count=0;

    file = fopen("inputfile.txt", "r");

    while (fgets(buffer, sizeof(buffer), file)){
        //Format : NAME is enrolled in DEPARTMENT NUMBER.
        if(3 == sscanf(buffer, "%19s %*s %*s %*s %4s %d",
                student.name, student.department, &student.course_number))
                students[count++] = student;
    }
    fclose(file);
    for(i = 0; i < count; ++i){
        printf("%-*s %-*s %d\n",
            (int)sizeof(student.name), students[i].name,
            (int)sizeof(student.department), students[i].department,
            students[i].course_number);
    }
    return 0;
}