0

我对 strcpy() 函数有疑问。我要做的是用户输入文件名,我基本上打开文件,获取内容并创建文件副本。

但是,我决定进行一些错误检查,以检查内容 read() 是否与写入副本文件中的内容相同,然后再写入。因此,我使用文件读取的文件大小将内容读取到动态数组中,因此缓冲区是数据的正确大小。然后我想将它的副本创建到另一个动态缓冲区中,并使用 strcmp() 查看它们是否相同,如果是,那么我将复制缓冲区写入输出文件?

这适用于某些文件,但视频文件(mpeg)等问题,当打开视频文件时出现错误“无法确定流的类型”,这是这个想法

char* buffer1 = malloc(filessize);
char* buffer2 = malloc(filessize);
read(file, buffer1, filesize);
strcpy(buffer2, buffer1); //copy buffer1 into buffer2
if(strcmp(buffer1, buffer2) == 0)
{
  write(outputfile, buffer2, filesize); //write copied buffer to file
}
free(buffer1); free(buffer2);

那么我在内存中创建另一个缓冲区副本的原因是我可以比较实际的位数据,而不仅仅是大小,所以我知道正在写入的数据与正在读取的数据相同?

4

2 回答 2

6

strcpy并且strcmp适用于以 0 结尾的 C 字符串。如果您的视频文件有任何值为 0 的字节,它们将停在那里。

您应该查看memcpyandmemcmp相反,它不会将您的缓冲区解释为 0 终止的字符串。

于 2011-01-11T13:20:08.473 回答
1

您应该改用 memcpy,因为 strcpy 只会复制到第一个 '\0' 字符。这对二进制文件效果不佳。真正的问题是为什么你想将文件的内容复制到内存中......你可以将原始缓冲区写出到一个新文件中。

于 2011-01-11T13:22:06.053 回答