我目前正在尝试从文件中扫描一行但是在字符串上有一个障碍。 这是我教授告诉我要做的例子。
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);
但是如何将字符串转换为整数或浮点数?
答案 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;
}
字符串类型和枚举之间的转换不能隐含。