fscanf 格式说明符到结构
fscanf format specifier into structs
我的数据格式如下:
22/March/2014
137 8
15 16 34 8 18
17/November/2014
106 8
22 29 30 9 6
20/November/2014
169 10
50 58 38 29 1
我正在尝试使用 fscanf 获取文件的内容并将它们放入以下结构中:
struct date{
//This is storing the date dd/month/yyyy.
char* fullDate;
// Number of foot and wheelchair passengers.
int foot;
int wheelchair;
//number of infant, child, adult, senior and family tickets sold
int infant;
int child;
int adult;
int senior;
int family;
};
所以我尝试了以下方法:
struct date r[50];
FILE* der = fopen("C:\Users\Def\Downloads\annual_sales_data_2014.txt","r");
int i = 0;
rewind(der);
fscanf(der, "%s", r[i].fullDate);
fscanf(der, "%d %d ", &r[i].foot, &r[i].wheelchair);
fscanf(der, "%d %d %d %d",&r[i].infant, &r[i].child, &r[i].adult, &r[i].senior, &r[i].family);
printf("%s\n%d %d\n%d %d %d %d %d\n\n", r[i].fullDate, r[i].foot, r[i].wheelchair, r[i].infant, r[i].child, r[i].adult, r[i].senior, r[i].family);
fclose(der);
但我认为 fscanf 没有被正确使用,我对格式说明符的文档感到有点困惑,我也尝试过这种方式。
fscanf(der, "%s/%s/%s\n%d %d\n%d %d %d %d %d\n", r[i].day, r[i].month, , r[i].year, &r[i].foot, &r[i].wheelchair, &r[i].infant, &r[i].child, &r[i].adult, &r[i].senior, &r[i].family);
在上面的示例中,我还为结构提供了接受 3 个字符* 来表示日期、月份和年份。在格式说明符字符串的开头。这也不起作用,所以我将其分解为更小的格式以查看是否可以诊断问题。
即使在分解示例中也是如此
fscanf(der, "%s", r[i].fullDate);
即使这样也会在调试器中中断并且无法找出原因。
谢谢。
fullDate
使用前必须先初始化。最简单的方法是:
r[i].fullDate = malloc(whatever_size_you_need);
或者您甚至可以将其声明为数组以避免额外的初始化:
struct date{
//This is storing the date dd/month/yyyy.
char fullDate[proper_size];
// ...
};
当然,您必须以某种方式确保读取的字符串适合缓冲区。
你说你认为 fscanf
没有被正确使用,这是真的。这行
fscanf(der, "%d %d %d %d", &r[i].infant, &r[i].child, &r[i].adult, &r[i].senior, &r[i].family);
正在为您要填写的 5 个字段传递参数,但它只有 4 个格式格式说明符。试试这个:
fscanf(der, "%d %d %d %d %d", &r[i].infant, &r[i].child, &r[i].adult, &r[i].senior, &r[i].family);
此外,您应该始终检查数据字段是否已正确读取。 fscanf
的 return 值会告诉您只读取了 4 个项目。
您不能用 fscanf(der, "%s", r[i].fullDate);
解析日期,因为 fulldate
是一个未初始化的指针。您应该传递 %s
格式的数组地址。在结构中放一个数组而不是指针,例如char fullDate[30];
并使用fscanf(der, "%29s", r[i].fullDate);
请注意,您可以直接使用以下方法解析日期组件:
char monthName[16];
int day, year;
if (fscanf("%d/%15[^ /]/%d", &day, monthName, &year) == 3) {
/* Date parsed correctly */
} else {
/* At least one field missing, bail out */
exit(1);
}
我的数据格式如下:
22/March/2014
137 8
15 16 34 8 18
17/November/2014
106 8
22 29 30 9 6
20/November/2014
169 10
50 58 38 29 1
我正在尝试使用 fscanf 获取文件的内容并将它们放入以下结构中:
struct date{
//This is storing the date dd/month/yyyy.
char* fullDate;
// Number of foot and wheelchair passengers.
int foot;
int wheelchair;
//number of infant, child, adult, senior and family tickets sold
int infant;
int child;
int adult;
int senior;
int family;
};
所以我尝试了以下方法:
struct date r[50];
FILE* der = fopen("C:\Users\Def\Downloads\annual_sales_data_2014.txt","r");
int i = 0;
rewind(der);
fscanf(der, "%s", r[i].fullDate);
fscanf(der, "%d %d ", &r[i].foot, &r[i].wheelchair);
fscanf(der, "%d %d %d %d",&r[i].infant, &r[i].child, &r[i].adult, &r[i].senior, &r[i].family);
printf("%s\n%d %d\n%d %d %d %d %d\n\n", r[i].fullDate, r[i].foot, r[i].wheelchair, r[i].infant, r[i].child, r[i].adult, r[i].senior, r[i].family);
fclose(der);
但我认为 fscanf 没有被正确使用,我对格式说明符的文档感到有点困惑,我也尝试过这种方式。
fscanf(der, "%s/%s/%s\n%d %d\n%d %d %d %d %d\n", r[i].day, r[i].month, , r[i].year, &r[i].foot, &r[i].wheelchair, &r[i].infant, &r[i].child, &r[i].adult, &r[i].senior, &r[i].family);
在上面的示例中,我还为结构提供了接受 3 个字符* 来表示日期、月份和年份。在格式说明符字符串的开头。这也不起作用,所以我将其分解为更小的格式以查看是否可以诊断问题。
即使在分解示例中也是如此
fscanf(der, "%s", r[i].fullDate);
即使这样也会在调试器中中断并且无法找出原因。
谢谢。
fullDate
使用前必须先初始化。最简单的方法是:
r[i].fullDate = malloc(whatever_size_you_need);
或者您甚至可以将其声明为数组以避免额外的初始化:
struct date{
//This is storing the date dd/month/yyyy.
char fullDate[proper_size];
// ...
};
当然,您必须以某种方式确保读取的字符串适合缓冲区。
你说你认为 fscanf
没有被正确使用,这是真的。这行
fscanf(der, "%d %d %d %d", &r[i].infant, &r[i].child, &r[i].adult, &r[i].senior, &r[i].family);
正在为您要填写的 5 个字段传递参数,但它只有 4 个格式格式说明符。试试这个:
fscanf(der, "%d %d %d %d %d", &r[i].infant, &r[i].child, &r[i].adult, &r[i].senior, &r[i].family);
此外,您应该始终检查数据字段是否已正确读取。 fscanf
的 return 值会告诉您只读取了 4 个项目。
您不能用 fscanf(der, "%s", r[i].fullDate);
解析日期,因为 fulldate
是一个未初始化的指针。您应该传递 %s
格式的数组地址。在结构中放一个数组而不是指针,例如char fullDate[30];
并使用fscanf(der, "%29s", r[i].fullDate);
请注意,您可以直接使用以下方法解析日期组件:
char monthName[16];
int day, year;
if (fscanf("%d/%15[^ /]/%d", &day, monthName, &year) == 3) {
/* Date parsed correctly */
} else {
/* At least one field missing, bail out */
exit(1);
}