我编写了一个简单的文件应用程序来读取文件中的输入数据。我试图删除空格(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中的字符串。
答案 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)
下面:
unsigned char buf[512], i=0;
i
应为整数。
请勿复制'\0'
个字符,否则打印字符串将始终在找到的'\0'
上结束。