c ++ fscanf%c dosn正常工作

时间:2014-05-19 13:48:03

标签: c printf scanf

我有一个包含此内容的输入文件:

123 A 012345 ABC

我的代码是:

int main(void)
{
    FILE* fin;
    FILE* fout;
    int l;
    char d;
    char pk[ASD];
    char cd[BCD];

    fin = fopen("a.i1", "r");
    fscanf(fin, "%d %c %s %[^\n]", &l, &d, pk, cd);
    fclose(fin);

    fout = fopen("b.out", "w+");
    fprintf(fout, "%d %c %s %s", l, d, pk, cd);
    fclose(fout);
    return 0;
}

我的输出是:

123   012345 ABC

(在123和012345之间的notepad ++中为NULL) 为什么" d"没有价值' A'?

如果我这样读:

fscanf(fin, "%d%c %s %[^\n]", &l, &d, pk, cd);

我明白了:

10   B 01010112345 ABBA

但我不知道为什么。

2 个答案:

答案 0 :(得分:0)

实际上fscanf(fin,"%c",&c)在你的情况下输入一个字符是空格(输入文件中的123后面),所以当

fscanf(fin, "%d %c %s %[^\n]", &l, &d, w, m); 
执行

l contains 123, 
d contains (space), 
w contains "A" (next string after space)
and 
m contains "012345 ABC" (because delimiter is '\n')

所以基本上

fprintf(fout, "%d %c %s %s", l, d, w, m);

将打印预期值。但我认为值不会存储在您预期的变量中。

在您可能错过打印fprintf后检查w声明,以便"A"无法打印

答案 1 :(得分:-1)

测试fopen()fscanf()的返回值。

fin = fopen("a.i1", "r");
if (!fin) {
    perror("a.i1");
    exit(EXIT_FAILURE);
}
if (fscanf(fin, "%d %c %s %[^\n]", &l, &d, pk, cd) != 4) {
    fprintf(stderr, "fscanf() did not manage to assign 4 values.\n");
    exit(EXIT_FAILURE);
}
fclose(fin);