我正在尝试使用fgets()
和sscanf()
来读取和解析输入文件。这是我的功能(这里仅列出相关部分):
void reading_file(char* file)
{
FILE *f = fopen(file, "r");
char line[256];
while(fgets(line, sizeof(line), f))
{
int i = 0;
char str[20];
sscanf(line, "%d %s", &i, str);
printf("%d %s\n", i, str);
}
}
输入文件是:
0 be68c5bc1ee7be6f20728579ee082aed6214825b
1 e2d6c1bb794ff4545ef2f101ca904dbbb3ed3923
这段代码的输出是:
875849270 aa71dbd21bd2b05f3bd261256f443fd5f9f7272e
1633890352 465c63da3d0168553c1027eb00ca364c337ced44
完全错了。
有趣的部分在这里。如果我使用结构来保存输入行,输出是正确的!修改后的代码在这里:
typedef struct s_s{
int id;
char hash[20];
} s_t;
void reading_file(char* file)
{
FILE *f = fopen(file, "r");
char line[256];
while(fgets(line, sizeof(line), f))
{
s_t s;
sscanf(line, "%d %s", &s.id, s.hash);
printf("%d %s\n", s.id, s.hash);
}
}
输出与输入文件完全相同。这是为什么?有人有解释吗?
答案 0 :(得分:0)
while(fgets(line, sizeof(line), file))
不应该while(fgets(line, sizeof(line), f))
?
您可以查看fgets()的man page。
接下来,要更正代码中的问题,char str[20];
需要更改为char str[128];
,因为string
文件的输入要长得多而不是20
个角色。
但是,对于使用返回正确答案的结构,IMO是Undefined behaviour的一部分。