fscanf的输出未按预期进行

时间:2016-02-23 11:14:50

标签: c scanf

我编写了一个简单的文件应用程序来读取文件中的输入数据。我试图删除空格(32)和换行符(10)。输出是 文件程序

#include <stdio.h>
int main() 
{
    FILE *f;
    char c;
    unsigned char buf[512],i=0;
    printf("in f_read\n");
    f = fopen("S:\\db\\result-enc.txt","rb");
    while( fscanf( f, "%c", &c ) > 0){
        if(c==32 || c==10)
           ;
        else
           buf[i++]=c;
    }
    buf[i]='\0';
    printf("%s\n",buf);
    return 0;
}

数据

61 AF AF BF 26 00 66 A6 E6 4B E1 C8 68 20 21 38
AE FD 4C DF 40 39 08 32 82 29 B0 1D FE 17 ED 96
C3 66 6D 4A 12 1C E1 05 84 FF A8 85 C3 87 78 28
8D 43 10 F5 C7 BD 68 F6 11 08 68 DC FF 96 D8 C6
AC 7F 2F 1E 09 EF 80 33 ED 1D 91 CE D7 D8 92 41
58 9D 4F AA C4 9E 28 DD 53 BE E6 69 EC 08 86 3F
41 CB B5 48 1A 60 07 26 0B D5 1D E0 2F A4 B1 2E
23 EC 78 D8 F9 0C E9 FC 61 BD D8 B3 B4 09 CF 9A

输出

409CF9A

我想看到的是将整个数据作为存储在buf中的字符串。

2 个答案:

答案 0 :(得分:1)

我假设i溢出,因为超过255个字符既不是换行也不是空格。 (如果i为255,i++将在char为8位的机器上产生0。)

字符串“结束”然后在该字符的前0个字符处(或在文件末尾,以先到者为准),因为当您将字符复制到{{1时,不会过滤掉跳过换行符和空格的方式的0个字符}}。 (就printf的buf转换而言,它“结束”,即使许多字符可能已写入缓冲区中的该位置。)

%s成为一个int或i,不要复制'\ 0'字符(实际上:从评论到你的帖子跟随Klas的建议并使用便携式和详尽的{{1如果您愿意的话,加上size_t。检查isprint()的界限。只需使用isspace()进行char-by-char读取,而不是buf

就输出而言:getc()不是显示“二进制”数据的合适方式(即字节值包括值&lt; 32,可能值> 127)因为这些字节序列将由您的终端解释(换页符,退格键覆盖早期输出,转义序列更改终端设置等)。要么过滤掉那些,要么只显示十六进制数据,就像向我们展示原始数据一样。

答案 1 :(得分:1)

  1. 下面:

    unsigned char buf[512], i=0;
    

    i应为整数。

  2. 请勿复制'\0'个字符,否则打印字符串将始终在找到的'\0'上结束。