Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C:逐行读取文件并将数据插入结构_C - Fatal编程技术网

C:逐行读取文件并将数据插入结构

C:逐行读取文件并将数据插入结构,c,C,我需要读取一个文本文件并将数据存储在一个结构中。我已经完成了使用file*fp=fopen(“datafile.txt”,“r”)打开文件的部分,使用fgets(buffer,sizeof(buffer),fp)读取数据。我的文件结构如下 John is enrolled in MATH 1314 Steve is enrolled in MATH 1314 struct course { char name[20]; char department[4]; int num

我需要读取一个文本文件并将数据存储在一个结构中。我已经完成了使用
file*fp=fopen(“datafile.txt”,“r”)
打开文件的部分,使用
fgets(buffer,sizeof(buffer),fp)
读取数据。我的文件结构如下

John is enrolled in MATH 1314
Steve is enrolled in MATH 1314


struct course {
   char name[20];
   char department[4];
   int number[4];
};

int main(void)
{
  FILE *fp;
  char* token;
  char* line[50];

  struct course student; 

  fp = fopen("input-hw04b.txt", "r");
  while (fgets(line, sizeof(line), fp) != NULL)
  {
     token = strtok(buffer, " ");
     while (token != NULL)
     {
        /* Add structures here */
        token = strtok(NULL, " ");
     }
  }
}
/*Add Structres Here*/
token = strtok(line, " ");
int j = 1;
strncpy(student.name,token,strlen(token));
while(token!=NULL)
{
    token = strtok(NULL, " ");
    switch(j)
    {
        case 5: strncpy(student.department,token,strlen(token));
                break;

        case 6: student.number = atoi(token);
                break;
    }
    j++;
}
j=0;

/*Your outer loop code continues*/
我需要存储以下内容

  • 约翰以学生的名义
  • 学生部的数学
  • 1314学生号

到目前为止,这就是我所拥有的,我被困在如何将这些数据放入结构中。我从文本文件中提取数据,逐行读取数据,然后对其进行标记,以便尝试将其放入结构中。

以下是基于现有代码的一些提示

 int count = 0;
 token = strtok(buffer, " ");
 while (token != NULL)
 {
       if (count == 0)
       {
           strncpy(student.name, token, 20);
           student.name[19] = '\0'; // ensure null termination
       }
       else if (count == 1)
       {
           /* validate "is" */
           if (strcmp(token, "is") != 0)
               break;
       }
       else if (count == 2) { /*validate "enrolled"*/  }

       else if (count == 3) { /* validate "in"*/  }

       else if (count == 4)
       {
           // set the department field
       }
       else if (count == 5)
       {
           // set the number field
       }
       count++;


       token = strtok(NULL, " ");
 }

当然,这个示例没有处理一些健壮性问题(例如,name可能大于20个字符,或者字符串中可能只有3个单词,等等)。但是应该开始了…

您可以按如下方式解析和存储字符串

John is enrolled in MATH 1314
Steve is enrolled in MATH 1314


struct course {
   char name[20];
   char department[4];
   int number[4];
};

int main(void)
{
  FILE *fp;
  char* token;
  char* line[50];

  struct course student; 

  fp = fopen("input-hw04b.txt", "r");
  while (fgets(line, sizeof(line), fp) != NULL)
  {
     token = strtok(buffer, " ");
     while (token != NULL)
     {
        /* Add structures here */
        token = strtok(NULL, " ");
     }
  }
}
/*Add Structres Here*/
token = strtok(line, " ");
int j = 1;
strncpy(student.name,token,strlen(token));
while(token!=NULL)
{
    token = strtok(NULL, " ");
    switch(j)
    {
        case 5: strncpy(student.department,token,strlen(token));
                break;

        case 6: student.number = atoi(token);
                break;
    }
    j++;
}
j=0;

/*Your outer loop code continues*/

同样,在您的结构声明中,您给出了
int number[4]
(它存储4个整数),这在您的情况下是错误的,请将其更改为
int number
。此外,在
char*line[50]
中,将其更改为
char-line[50]

了解如何解析这些字符串/行,并从C中获取预期信息。在这里或谷歌搜索存档,而不是询问代码。
char*line[50]
应该是
char-line[50]
。在您的结构中,您只能存储一个学生,如果要存储多个学生,您需要一个结构数组或链接列表或类似的内容
char department[4]
只能容纳长度不超过3个字符的字符串,但这里的“MATH”是4个字符的长度。你忘了考虑零终止符。顺便说一句,什么是缓冲区?我猜你指的是strok(第行“”)而不是strok(缓冲区“”),你忘记了最初的strok(缓冲区“”)@Claptrap-那已经在OP的原始代码中了。为了简洁起见,我没有包括这一部分。我整理了编辑后的答案。我试着按照你的例子做,但我没有得到任何结果