我在这样的文本文件中使用fscanf:
public class SkipMapper extends Mapper<LongWritable, Text, Text, Text> {
private boolean skip;
@Override
protected void map(LongWritable key, Text value,
Mapper<LongWritable, Text, Text, Text>.Context context)
throws IOException, InterruptedException {
// map with the matcher
if (match) {
skip = true;
}
}
@Override
public void run(Mapper<LongWritable, Text, Text, Text>.Context context)
throws IOException, InterruptedException {
setup(context);
try {
while (!skip && context.nextKeyValue()) {
map(context.getCurrentKey(), context.getCurrentValue(), context);
}
} finally {
cleanup(context);
}
}
}
我试图计算使用malloc的行数并使用:
T 1 1000
T 2 700
N 3 450
Y 4 200
奖金是一个结构:
Prize temp;
int count =0;
while ((fscanf(fa,"%c %d %f", &temp.A, &temp.B, &temp.C))!= EOF)
count ++;
所以,在读完这些行后,程序会打印出来:
typedef struct {
char A;
int B;
float C;
} Prize;
使用调试器我注意到 A: T B: 1 C: 1000.0000
A: B: 0 C: 0.0000
A: T B: 2 C: 700.0000
A: B: 0 C: 0.0000
A: N B: 3 C: 450.0000
A: B: 0 C: 0.0000
A: Y B: 4 C: 200.0000
得到了(例如在阅读第一行时):
A = 84&#39; T&#39;,B = 1,C = 1000
而不是读第二行它读取另一行,但是像这样:
A = 10&#39; \ n&#39;,B = 1,C = 1000
并继续为每一行执行此操作,但最后一行。
我控制了文件并且它没有多余的空格或行。
有任何解决问题的建议吗?
答案 0 :(得分:1)
您的文件包含换行符。所以文件中的字符序列实际如下:
T 1 1000\nT 2 700\n...
第一个fscanf会读取'T'
,1
和1000
。它停在'\n'
字符处。
秒fscanf将'\n'
字符读取到temp.A
。现在它处于第二个'T'字符。因此,它无法阅读temp.B
和temp.C
第三个fscanf会读取'T'
,2
和700
,但会再次停在'\n'
。
在阅读temp.A
之前,您应该跳过所有空格字符,这是由格式字符串中的空格完成的:
...fscanf(fa," %c %d %f", &temp.A, &temp.B, &temp.C)...
答案 1 :(得分:0)
阅读的%c
格式不会忽略任何space
或\n
字符,即使是看不见的字符。但是%s %d %c
会。如果将%c
替换为%s
(并且单个字符为字符串),则可能是避免不一致的更好方法。
char str[maxn];
fscanf(fa, "%s%d%f", str, &temp.B, &temp.C);
temp.A = str[0];