使用fscanf从文件中读取整数

5

gcc 4.4.4 c89

我有一个包含姓名、年龄和性别的文件。我试图读取年龄。

"Bloggs, Joe" 34 M

我可以成功打开文件:

fp = fopen("input.txt", "r");
if(fp == NULL) {
    fprintf(stderr, "Failed to open file [ %s ]\n", strerror(errno));
    return 1;
}

我尝试在 34 岁的年龄里阅读。

相关的 IT 技术内容:

int age = 0;
int result = 0;
result = fscanf(fp, "%d", &age);

然而,当我尝试打印结果时,年龄和结果总是显示为零。
非常感谢任何建议。
2个回答

12
你没有对名字进行任何跳过处理,因此它正在查看该文本,尝试将其转换为整数并失败,因此返回值为0(0次转换成功),变量中的值保持不变。你需要添加代码来跳过名字,然后读取年龄:
fscanf(fp, "%*c%*[^\"]\" %d", &age);

初始的 "%c" 读取了初始引号。 "%[^\"]\" 读取到下一个引号(包括它本身)的所有字符。在这两种情况下, "*" 意味着将读取值但不存储在任何地方。之后,我们可以使用 "%d" 读取数字。


1

你的字符串格式不仅仅是一个数字。如果你只想读取年龄,需要包含头文件并在 fscanf 语句之前添加以下内容。

int ch=0;
while(((ch=fgetc(stream)))!=EOF && !isdigit(ch)){}
ungetc(ch,stream);

1
为了正确工作,您需要将ch更改为int而不是char,并且您需要将while循环更改为类似以下的内容:while (EOF != (ch=fgetc(stream)) && !isdigit((unsigned char)ch)) - Jerry Coffin
1
有缺陷的代码。永远不要将fgetc的结果存储在char中,因为您会失去检测EOF返回的能力。始终使用int。请注意,如果代码在没有找到任何数字的情况下遇到EOF,它将无限循环。 - R.. GitHub STOP HELPING ICE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接