2012-01-08 55 views
0
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将()写入错误数据

+1

为什么不'fwrite(data,1,len,handle)'? – 2012-01-08 18:29:23

+0

无数的0xFF有多少?您确定计数不仅仅是您正在编写的字符串中的0x1A(control-Z)字符之后的字符数,而是在您的代码中给出或取消错误的错误? – 2012-01-08 18:34:43

+1

C或C++?选一个?这不是你应该在C++中使用的代码。如果你不能算,那么编程可能不适合你。 – 2012-01-08 18:37:22

回答

2

您正在编写len+1字符而不是len个字符。

变化:

for(int i=0; i <= len; i++) 

到:

for(int i=0; i < len; i++) 

(请注意,这个bug在评论已经提到你前面的问题 - 请务必仔细阅读所有你的答案和意见认真。 )

+0

Dit it。问题依然存在。我确信这是由于0x1A字符发生的,我仍然不知道为什么。如果我从数据中删除了0x1a字符,那么它工作正常 – user1091856 2012-01-08 18:30:23

+1

@ user1091856:然后删除0x1A字符。它不应该在那里。 – 2012-01-08 18:38:23

6

十六进制0x1A也被称为Control-Z。

在Windows上(当然,DOS源于它),文本文件通过在文件中嵌入control-Z来指示EOF。

如果要编写二进制数据,请确保输出文件作为二进制文件打开。如果将其作为文本文件打开,则只能输出文本(这意味着非常有限的控制字符;可能只是选项卡和换行符,系统会照顾CRLF < - > LF映射)。

+0

太好了!这正是你所说的。我在fopen函数的mode参数上加了一个'b',并且它工作。谢谢 – user1091856 2012-01-08 18:37:13

+0

CPM发起CPM,因为CPM没有以字节为单位存储文件的大小,而是存储在磁盘块的数量中。最后一个块中文件有效部分的末尾用0x1A表示。 – AProgrammer 2012-01-08 19:36:46

+0

@AProgrammer:谢谢 - 不知何故,这并不令我感到意外,但我忘记了CP/M。 – 2012-01-08 22:45:08