我正在使用UDP协议传输文件,但是当我使用strcpy()将缓冲区复制到另一个字符串时,它总是会丢失一些字符。
简单的想法是: 我定义了一个结构:
struct frame{
int kind;//transmission(0) or retransmission(1)
int seq;
int ack;
char info[256];
};
然后我使用fread将文本文件的内容放入缓冲区:
char buffer[256] = {0};
fread(buffer, 256, 1, fp);//read file: 256 byte
struct frame currFrame;
currFrame.ack = 0;
bzero(currFrame.info, 256);
strcpy(currFrame.info, buffer); //store the content to transfer
printf("%s\n", buffer);
printf("%s\n", currFrame.info);
上面的代码是for循环,因为我多次读取文件。
当我使用printf(),半场时,结果是正确的。但是一半时间,他们是不同的(就像在头脑中遗漏了一些角色)。我该如何解决这个问题?
附加输出(上面是缓冲区,它是正确的):
答案 0 :(得分:4)
strcpy
函数仅适用于字符串。要复制任意数据,请使用memcpy
。此外,%s
格式说明符仅适用于字符串。像fread
这样的函数会读取任意二进制数据,而不会尝试形成字符串。
此外,您以这样一种方式调用fread
,它不会告诉您实际读取的字节数。除非你是肯定的,否则你总是要读取256个字节,这并不聪明。而是将fread
的第二个参数设置为1,并使用第三个参数设置要读取的最大字节数。并且不要忽略返回值 - 这就是你知道它实际能够读取多少字节的方式。