【发布时间】:2018-02-06 13:31:27
【问题描述】:
我有一个这样的文件:
X1034Example
X1234Example2
Y2934Example3
假设我已经打开了该文件并将其加载到*fp,我现在想匹配这样的行:“X”后跟 4 位数字后跟任何字符串,所以我假设会是这样的:
FILE **fp;
if ((*fp = fopen(fileName, "r")) == NULL) {
printf("Unable to read file: %d: %s\n", errno, strerror(errno));
exit(1);
}
int id; char label[64];
fscanf(*fp, "X%4d%s", &id, label)
但是,这不能正常工作,对于我使用这个 sn-p 测试的指定文件:
fscanf(*fp, "X%4d%s", &id, label);
printf("%d\n", id);
printf("%s\n", label);
fscanf(*fp, "X%4d%s", &id, label);
printf("%d\n", id);
printf("%s\n", label);
我的输出是
1
Example
1
Example
这仅仅是由于指针的非确定性行为还是我做错了什么?
编辑 1
所以在 X 之前添加一个空格解决了第一个问题,但现在我才意识到有些标签中有空格。
例如:
X1245Example Text Here
fscanf(*fp, " X%4d%s", &id, label);
printf("%d\n", id);
printf("%s\n", label);
应该产生:
1245
Example Text Here
【问题讨论】:
-
第 1 步遇到
fscanf()和朋友的问题。测试并报告其返回值。例如。if (fscanf(*fp, "X%4d%s", &id, label) != 2) Report_Error(); -
什么是
fp?是FILE **吗?请尝试创建Minimal, Complete, and Verifiable Example 向我们展示。 -
作为您的问题的提示,
"%s"格式会跳过(可能的)前导空格,而不是尾随。所以想想文件中每一行的结尾是什么。 -
当
*fp是stdin时在我的机器上工作正常