int writeFile(FILE * handle, char * data, int len)
{
fseek(handle, 0, SEEK_SET);
for(int i=0; i <= len; i++)
putc(data[i], handle);
}
当我调用此函数,它工作正常,但如果有一个0x1A的性格上char * data
它会写无数0xFF的。这是为什么?putc将()写入错误数据
int writeFile(FILE * handle, char * data, int len)
{
fseek(handle, 0, SEEK_SET);
for(int i=0; i <= len; i++)
putc(data[i], handle);
}
当我调用此函数,它工作正常,但如果有一个0x1A的性格上char * data
它会写无数0xFF的。这是为什么?putc将()写入错误数据
您正在编写len+1
字符而不是len
个字符。
变化:
for(int i=0; i <= len; i++)
到:
for(int i=0; i < len; i++)
(请注意,这个bug在评论已经提到你前面的问题 - 请务必仔细阅读所有你的答案和意见认真。 )
Dit it。问题依然存在。我确信这是由于0x1A字符发生的,我仍然不知道为什么。如果我从数据中删除了0x1a字符,那么它工作正常 – user1091856 2012-01-08 18:30:23
@ user1091856:然后删除0x1A字符。它不应该在那里。 – 2012-01-08 18:38:23
十六进制0x1A也被称为Control-Z。
在Windows上(当然,DOS源于它),文本文件通过在文件中嵌入control-Z来指示EOF。
如果要编写二进制数据,请确保输出文件作为二进制文件打开。如果将其作为文本文件打开,则只能输出文本(这意味着非常有限的控制字符;可能只是选项卡和换行符,系统会照顾CRLF < - > LF映射)。
太好了!这正是你所说的。我在fopen函数的mode参数上加了一个'b',并且它工作。谢谢 – user1091856 2012-01-08 18:37:13
CPM发起CPM,因为CPM没有以字节为单位存储文件的大小,而是存储在磁盘块的数量中。最后一个块中文件有效部分的末尾用0x1A表示。 – AProgrammer 2012-01-08 19:36:46
@AProgrammer:谢谢 - 不知何故,这并不令我感到意外,但我忘记了CP/M。 – 2012-01-08 22:45:08
为什么不'fwrite(data,1,len,handle)'? – 2012-01-08 18:29:23
无数的0xFF有多少?您确定计数不仅仅是您正在编写的字符串中的0x1A(control-Z)字符之后的字符数,而是在您的代码中给出或取消错误的错误? – 2012-01-08 18:34:43
C或C++?选一个?这不是你应该在C++中使用的代码。如果你不能算,那么编程可能不适合你。 – 2012-01-08 18:37:22