从文件扫描

时间:2011-05-09 00:14:48

标签: c enums unions scanf

我目前正在尝试从文件中扫描一行但是在字符串上有一个障碍。 这是我教授告诉我要做的例子。

enum status{MEM,PREP,TRAV}
union type { double int day, char* title, float cost}

13953 P 12 26 2011 1 5 2012 2 A 3.30 249.00 A 2.0 148.00 MEM Cuba Christmas 3 0 2 Sierra Del Rosario, Cuba
当我从文件中扫描它时,我很满意一切都接受(MEM古巴圣诞节)。我只使用fscanf()读取数据的第一部分,但MEM是枚举类型,其联合类型指示以下输入。我的问题在于扫描的语法。我尝试从MEM开始使用getline,但是由于城市/国家可以有空格,因此我使用标记化设置了障碍。不确定要使用的其他扫描我正在查看sscanf()但不确定它是否适用于文件。

更新:

int main(void);
{
 int m, length = 100;
 char *word, file_name[100];
 FILE *file_point
 printf("Please enter file name with .txt extension:");
 scanf("%s", file_name);
 file_point = fopen(file_name,"r");

  while (fscanf(file_point, "%d", &m) != EOF)
  {

  temp.dest_code = m;
  fscanf(file_point, " %c %d %d %d %d %d %d %d",
     &temp.area_code,
     &temp.Smonth, &temp.Sday, &temp.Syear,
     &temp.Emonth, &temp.Eday, &temp.Eyear,
     &temp.leg_num);
  for (n=0; n < temp.leg_num; n++)
    {
      fscanf(file_point," %c %f %f",
         &temp.tleg[n].travel_type,
         &temp.tleg[n].travel_time,
         &temp.tleg[n].cost);
    }
  fscanf(file_point," %d %d %d ",
     &temp.adult,
     &temp.child,
     &temp.infant);


  temp_name = (char *)malloc(length + 1);
  getline (&temp_name, &length, file_point);

  word = strtok(temp_name, ",");

  temp.dest_name=(char *)malloc(strlen(word)+1);
  strcpy(temp.dest_name, word);

  word = strtok(NULL, ",");

  temp.dest_country=(char *)malloc(strlen(word)+1);
  strcpy(temp.dest_country,word2);

  printf("name:%s country:%s\n", temp.dest_name, temp.dest_country);
      printf("adult:%d , child:%d , infant:%d \n", temp.adult, temp.child, temp.infant);

   }
}

这是我用作基础的代码,但我不知道如何处理枚举和联合。我在想做类似的事情:

getline(&status, &length, file_point);

但是如何将字符串转换为整数或浮点数?

2 个答案:

答案 0 :(得分:2)

如果我理解你的问题(我不确定),那么你面临的问题是在输入中看到'MEM'(或'PREP'或'TRAV')作为一个字符串,你必须了解如何处理以下数据。 enum表示您可能希望将字符串MEM转换为枚举中的MEM值。

很难完全自动化这种转换。简单地识别字符串并根据字符串决定做什么是最简单的:

if (strcmp(found_string, "MEM") == 0)
    ...do the MEM stuff...
else if (strcmp(found_string, "PREP") == 0)
    ...do the PREP stuff...
else if (strcmp(found_string, "TRAV") == 0)
    ...do the TRAV stuff...
else
    ...report unknown type code...

但是,您可以创建一个结构来处理从字符串到枚举值的转换。

struct StateConv
{
     const char *string;
     enum state  number;
};

static struct StateConv converter[] =
{
    { "MEM",  MEM  },
    { "PREP", PREP },
    { "TRAV", TRAV },
};
enum { NUM_STATECONV = sizeof(converter) / sizeof(converter[0]) };

enum state state_conversion(const char *string)
{
    for (int i = 0; i < NUM_STATECONV; i++)
    {
        if (strcmp(string, converter[i].string) == 0)
            return(converter[i].number);
    }
    fprintf(stderr, "Failed to find conversion for %s\n", string);
    exit(1);
}

您需要一个比“退出错误”更好的错误处理策略。

您的扫描代码需要阅读该字词,然后拨打state_conversion()。然后,根据您的回复,您可以以正确的方式阅读剩余的(以下)数据,以了解您所获得的状态。

答案 1 :(得分:1)

不,你不能以你的方式做到这一点。文件中的MEM是字符串类型,您需要像解析字符串一样解析它,然后根据该字符串设置枚举的值。 例如,当您要解析您的状态类型(MEM,PREP,TRAV)时:

char typeBuffer[6];
fscanf(file_point,"%5s",typeBuffer);

然后手动比较typeBuffer的内容:

status stat;
if (strcmp(typeBuffer, "MEM") == 0){
     stat = MEM;
}

字符串类型和枚举之间的转换不能隐含。