读取空文件时 fscanf 崩溃
fscanf crashing while reading empty file
我正在处理一个大型项目,该项目具有读取数据文件的功能。然而,在某些测试代码中,该文件不存在,因此在创建时,它会创建一个空文本文件。我写了下面的代码来补偿这个事件:
typedef struct system_boot_status_s{
char timestamp[18];
int power_down_type;
int power_down_cause;
int boot_number;
int antenna_deployed;
int images_captured;
int beacon_count;
}system_boot_status_t;
////////////////////////////////
// Read the boot status info into the boot status struct
ret = fscanf(f, "%s %d %d %d %d %d %d",
bootstatus->timestamp,
bootstatus->power_down_type,
bootstatus->power_down_cause,
bootstatus->boot_number,
bootstatus->antenna_deployed,
bootstatus->images_captured,
bootstatus->beacon_count);
if (ret != 7) // if 7 items weren't read
{
// Make sure all boot status members are set to 0
snprintf(bootstatus->timestamp, BOOT_INFO_LEN, "xx-xx-xx-xx-xx-xx");
bootstatus->power_down_type = 0;
bootstatus->power_down_cause = 0;
bootstatus->boot_number = 0;
bootstatus->antenna_deployed = 0;
bootstatus->images_captured = 0;
bootstatus->beacon_count = 0;
return -1;
}
我知道 fscanf returns 它读取的东西的数量,但是当我 运行 这个程序并且它到达空文件时,我的程序就冻结了。我错过了我应该用 EOF 做的事情吗?谁能帮我吗?
fscanf 的参数(第三个和下一个)必须是指向适当类型的指针。在最简单的情况下可以使用 & operator
难题,无法从较短的 int 类型(字符/字节)自动转换
ret = fscanf(f, "%s %d %d %d %d %d %d",
bootstatus->timestamp, // string
&bootstatus->power_down_type, // int
...
);
这取决于声明,我的示例中只允许使用 int 声明
如果没有整数,使用临时变量。在这个例子中,时间戳是不同种类的整数类型(字节等)
int tmp1;
ret = fscanf(f, "%s %d %d %d %d %d %d",
bootstatus->timestamp,
&tmp1 ,
...
);
bootstatus->power_down_type = tmp1;
违反此规则会产生严重问题(取决于系统、编译器等)
我的回答是基于假设,而不是这个结构的真实声明,在撰写本文时未知
您正在将 int
(按值)传递给接受变量指针 (int*
) 的函数。
只需传递一个变量地址,它就不会再冻结了。
您可以通过取消引用来获取变量地址 &var
.
ret = fscanf(f, "%s %d %d %d %d %d %d",
bootstatus->timestamp,
bootstatus->power_down_type,
bootstatus->power_down_cause,
bootstatus->boot_number,
bootstatus->antenna_deployed,
bootstatus->images_captured,
bootstatus->beacon_count);
到
ret = fscanf(f, "%s %d %d %d %d %d %d",
bootstatus->timestamp,
&bootstatus->power_down_type,
&bootstatus->power_down_cause,
&bootstatus->boot_number,
&bootstatus->antenna_deployed,
&bootstatus->images_captured,
&bootstatus->beacon_count);
但不是字符串!尽管 ×tamp
指向与 timestamp
.
相同的地址
我正在处理一个大型项目,该项目具有读取数据文件的功能。然而,在某些测试代码中,该文件不存在,因此在创建时,它会创建一个空文本文件。我写了下面的代码来补偿这个事件:
typedef struct system_boot_status_s{
char timestamp[18];
int power_down_type;
int power_down_cause;
int boot_number;
int antenna_deployed;
int images_captured;
int beacon_count;
}system_boot_status_t;
////////////////////////////////
// Read the boot status info into the boot status struct
ret = fscanf(f, "%s %d %d %d %d %d %d",
bootstatus->timestamp,
bootstatus->power_down_type,
bootstatus->power_down_cause,
bootstatus->boot_number,
bootstatus->antenna_deployed,
bootstatus->images_captured,
bootstatus->beacon_count);
if (ret != 7) // if 7 items weren't read
{
// Make sure all boot status members are set to 0
snprintf(bootstatus->timestamp, BOOT_INFO_LEN, "xx-xx-xx-xx-xx-xx");
bootstatus->power_down_type = 0;
bootstatus->power_down_cause = 0;
bootstatus->boot_number = 0;
bootstatus->antenna_deployed = 0;
bootstatus->images_captured = 0;
bootstatus->beacon_count = 0;
return -1;
}
我知道 fscanf returns 它读取的东西的数量,但是当我 运行 这个程序并且它到达空文件时,我的程序就冻结了。我错过了我应该用 EOF 做的事情吗?谁能帮我吗?
fscanf 的参数(第三个和下一个)必须是指向适当类型的指针。在最简单的情况下可以使用 & operator
难题,无法从较短的 int 类型(字符/字节)自动转换
ret = fscanf(f, "%s %d %d %d %d %d %d",
bootstatus->timestamp, // string
&bootstatus->power_down_type, // int
...
);
这取决于声明,我的示例中只允许使用 int 声明
如果没有整数,使用临时变量。在这个例子中,时间戳是不同种类的整数类型(字节等)
int tmp1;
ret = fscanf(f, "%s %d %d %d %d %d %d",
bootstatus->timestamp,
&tmp1 ,
...
);
bootstatus->power_down_type = tmp1;
违反此规则会产生严重问题(取决于系统、编译器等)
我的回答是基于假设,而不是这个结构的真实声明,在撰写本文时未知
您正在将 int
(按值)传递给接受变量指针 (int*
) 的函数。
只需传递一个变量地址,它就不会再冻结了。
您可以通过取消引用来获取变量地址 &var
.
ret = fscanf(f, "%s %d %d %d %d %d %d",
bootstatus->timestamp,
bootstatus->power_down_type,
bootstatus->power_down_cause,
bootstatus->boot_number,
bootstatus->antenna_deployed,
bootstatus->images_captured,
bootstatus->beacon_count);
到
ret = fscanf(f, "%s %d %d %d %d %d %d",
bootstatus->timestamp,
&bootstatus->power_down_type,
&bootstatus->power_down_cause,
&bootstatus->boot_number,
&bootstatus->antenna_deployed,
&bootstatus->images_captured,
&bootstatus->beacon_count);
但不是字符串!尽管 ×tamp
指向与 timestamp
.