fscanf读访问故障

fscanf读访问故障,c,ubuntu,file-io,scanf,C,Ubuntu,File Io,Scanf,我已成功打开包含初始键值对的文件。代码如下所示: char key_tmp[30]; int value_tmp, status_index; FILE *ZMU_Init_fd = NULL; ZMU_Init_fd = fopen("zmu/zmu.cfg", "r"); if(ZMU_Init_fd == NULL) { printf("Could not open file"); strerror(errno); } printf("key tmp is %s,

我已成功打开包含初始键值对的文件。代码如下所示:

char key_tmp[30];
int value_tmp, status_index;

FILE *ZMU_Init_fd = NULL;
ZMU_Init_fd = fopen("zmu/zmu.cfg", "r");

if(ZMU_Init_fd ==  NULL)
{
    printf("Could not open file");
    strerror(errno);
}

printf("key tmp is %s, value tmp is %d\n", key_tmp, value_tmp);
fscanf(ZMU_Init_fd, "%s %s", key_tmp, (char *)value_tmp);
printf("key tmp is %s, value tmp is %d\n", key_tmp, value_tmp);
MessageNum= message50
MsgInitOne= 0x01
MsgInitTwo= 0x04
MsgInitThree= 0x01

MessageNum= message50
VarOne= 0x02
VarTwo= 0x01

MessageNum= message50
MsgValOne= 0x01
MsgValTwo= 0x04
MsgValThree= 0x02
当我跑步时,我得到:

key tmp is y? value tmp is 1
然后,它会出现故障。当我将访问权限更改为“w”时,代码将zmu.cfg文件大小设置为0,我得到:

key tmp is y? value tmp is 1
key tmp is y? value tmp is 1
key tmp is y? value tmp is 1
key tmp is y? value tmp is 1
没有断层。。。有趣的是,一旦文件为0字节,我就可以将访问权限更改回“r”,它不再存在SEGFULTS,我得到:

key tmp is y? value tmp is 1
key tmp is y? value tmp is 1
key tmp is y? value tmp is 1
key tmp is y? value tmp is 1
我相信这与fscanf的工作方式有关。fscanf扫描时是否从文件中删除该行?我所要做的就是从文本文件中获取一个键值对。我想我不能用fread,因为钥匙的大小不总是一样的。我不想修改文件,有什么想法吗

zmu.cfg如下所示:

char key_tmp[30];
int value_tmp, status_index;

FILE *ZMU_Init_fd = NULL;
ZMU_Init_fd = fopen("zmu/zmu.cfg", "r");

if(ZMU_Init_fd ==  NULL)
{
    printf("Could not open file");
    strerror(errno);
}

printf("key tmp is %s, value tmp is %d\n", key_tmp, value_tmp);
fscanf(ZMU_Init_fd, "%s %s", key_tmp, (char *)value_tmp);
printf("key tmp is %s, value tmp is %d\n", key_tmp, value_tmp);
MessageNum= message50
MsgInitOne= 0x01
MsgInitTwo= 0x04
MsgInitThree= 0x01

MessageNum= message50
VarOne= 0x02
VarTwo= 0x01

MessageNum= message50
MsgValOne= 0x01
MsgValTwo= 0x04
MsgValThree= 0x02

您在第一次呼叫时体验到未定义的行为

printf("key tmp is %s, value tmp is %d\n", key_tmp, value_tmp);
key\u tmp
value\u tmp
均未初始化为任何值。尝试访问未初始化的值后,所有下注都将关闭。您的代码可能会给您一些输出,或者它可能会出错--您正在经历未定义的行为--任何事情都可能发生

此外,如果您正在
value\u tmp
中读取
int
,则您的
fscanf
格式字符串应为:

fscanf(ZMU_Init_fd, "%s %d", key_tmp, &value_tmp);

在这里使用之前,您没有初始化
key\u tmp

printf("key tmp is %s, value tmp is %d\n", key_tmp, value_tmp);
您将错误的参数传递给了
fscanf
。将
value\u tmp
强制转换为
char*
不会使其保存字符串

fscanf(ZMU_Init_fd, "%s %s", key_tmp, (char *)value_tmp);
如果文件包含整数,请使用:

fscanf(ZMU_Init_fd, "%s %d", key_tmp, &value_tmp);
如果文件包含字符串,请确保
value\u tmp
是一个足以容纳数据的字符串

char value_temp[1000];
然后,使用:

fscanf(ZMU_Init_fd, "%s %s", key_tmp, value_tmp);

耶!我将最后几行更改为:

fscanf(ZMU_Init_fd, "%s %s", key_tmp, key_tmp);
printf("key tmp is %s, value tmp is %d\n", key_tmp, value_tmp);
fscanf(ZMU_Init_fd, "%s %x", key_tmp, &key_tmp);
printf("key tmp is %s, value tmp is %d\n", key_tmp, value_tmp);
我得到:

key tmp is message50 value tmp is 8388608
key tmp is MsgInitOne value tmp is 1

感谢您查看我的代码,我不认为我需要为%i将key_tmp的地址传递给fscanf,因为我不需要为%s传递地址。

我真的不在乎第一次打印时的值,我只是打印它们以查看它们是否更改。@MeganB进入未定义行为领域后,您的代码就无法得到任何依赖。您可能会得到一个合适的值,它可能会无问题完成,也可能会出现故障和崩溃。从那一点开始,代码的操作就是没有定义的。很好,我应该已经初始化了。我以后会避开这种事情。MessageNum的键值只是一个占位符,供将来可能编辑此文件的人使用,几乎就像一条注释。我真的只关心十六进制值。我想我可以这样做:fscanf(ZMU_Init_fd,“%s%s”,key_tmp,key_tmp);我将更新并重新发布。如果您这样做,您很可能会得到值覆盖的密钥。对于第一行,我无论如何都要放弃密钥-值对,问题肯定不是传递值的地址\u tmp。我的问题是否因为没有初始化值而被否决?被否决会让我很沮丧,不想再问这样的问题。@MeganB,我不知道你的问题为什么被否决了。也有很多胆小鬼懒得解释为什么他们否决了一个问题或答案。