fprintf在for循环中打印奇怪的字符

时间:2014-11-28 01:18:48

标签: c file-io printf

我有一个程序在for循环中多次确定int,fc1的值,并使用fprintf将其输出到文件。

for (i=0; i<80; i++)
{
    fc1 = somefunction(); // this function determines if fc is 0 or 1

    // printing fc1 to stdout
    printf("%d\n", fc1);

    // printing output to file
    fprintf(out, "%d ", fc1);
}

每当我运行80次或更少次循环时,文件输出就像预期的那样:

1 0 1 0 1 1 0 0 0 0 1 0 1 1 1 1 0 0 0 1 1 0 1 1 1 0 1 0 0 1 1 1 0 0 1 0 0 1 0 1 0 1 0 1 1 0 1 1 0 0 0 1 0 1 0 1 0 0 1 1 0 0 1 0 0 0 0 0 0 1 1 1 0 1 0 1 0 1 0 0 

然而,一旦我循环81次或更多次,文件输出就是垃圾..

‱‰‱‰‱‱‰‰‰‰‱‰‱‱‱‱‰‰‰‱‱‰‱‱‱‰‱‰‰‱‱‱‰‰‱‰‰‱‰‱‰‱‰‱‱‰‱‱‰‰‰‱‰‱‰‱‰‰‱‱‰‰‱‰‰‰‰‰‰‱‱‱‰‱‰‱‰‱‰‰‱

不管怎么说,即使我正在打印一个整数,它也会输出U + 2030和U + 2031。

当我尝试

fprintf(out, "%d", fc1);
fputc(' ', out); // i changed the fprintf to fprintf the int and fputc the space

没有什么变化,这个问题仍然会发生,但是当我做的时候

fprintf(out, "%d", fc1);
fputc(' ', out);
fputc(' ', out);

不知怎的,它有效!输出将有2个空格,

1  0  1  0  1  1  0  0  0  0  1  0  1  1  1  1  0  0  0  1  1  0  1  1  1  0  1  0  0  1  1  1  0  0  1  0  0  1  0  1  0  1  0  1  1  0  1  1  0  0  0  1  0  1  0  1  0  0  1  1  0  0  1  0  0  0  0  0  0  1  1  1  0  1  0  1  0  1  0  0  1  

有人能告诉我使用fprintf有什么问题吗?

其他一些信息

  • 所有变量都是int
  • 文件指针已正确设置
  • 每次循环运行时,
  • fc1肯定有1或0(因为我将值打印到stdout,我可以看到它的0或1)
  • GNU GCC编译器,Windows 7上的MingW CodeBlocks 12.11

编辑:

这里是somefunction()

int fc(int a, int b, int c, int d, int e)
{
    int bits = a*10000+b*1000+c*100+d*10+e;
    switch(bits)
    {
        case 0:
        case 1:
        case 100:
        case 101:
        case 111:
        case 1000:
        case 1001:
        case 1110:
        case 1111:
        case 10000:
        case 10001:
        case 10010:
        case 10100:
        case 10110:
        case 11010:
        case 11110:
            return 1;
            break;
        default:
            return 0;
            break;
    }
}

以及我打开文件指针的方式

FILE *out = fopen("out.txt", "w");

我用Windows上的记事本打开输出文件

1 个答案:

答案 0 :(得分:3)

查看ASCII表,尤其是

的条目
  1. space:0x20
  2. '0':0x30
  3. '1':0x31
  4. 您的程序似乎做的一切正确,但您的查看器太聪明完全离开了。

    尽管如此,仍有希望:您可以强制您的观众在开场或观看期间使用特定的编码,或者您可以切换到另一个。

    BTW:Windows上的记事本使用启发式黑盒函数IsTextUnicode来判断文本是否为unicode。