fscanf读取两行

时间:2016-06-26 11:16:51

标签: c

我在这样的文本文件中使用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

并继续为每一行执行此操作,但最后一行。

我控制了文件并且它没有多余的空格或行。

有任何解决问题的建议吗?

2 个答案:

答案 0 :(得分:1)

您的文件包含换行符。所以文件中的字符序列实际如下:

T 1 1000\nT 2 700\n...

第一个fscanf会读取'T'11000。它停在'\n'字符处。

秒fscanf将'\n'字符读取到temp.A。现在它处于第二个'T'字符。因此,它无法阅读temp.Btemp.C

第三个fscanf会读取'T'2700,但会再次停在'\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];