2011-01-11 240 views
0

我对strcpy()函数有个疑问。我想要做的是用户输入文件名,我基本打开文件,获取内容并创建文件副本。c 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); 

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

+0

你有没有试过在二进制模式下打开视频文件? – programmer 2011-01-11 13:20:00

+0

简短的完整性检查:为什么要将文件内容复制到内存中?这绝对没有必要,因为文件内容可以用读缓冲区的内容直接写入。 – 2011-01-11 13:25:24

回答

1

您应该使用memcpy来代替,因为strcpy只会复制到第一个'\ 0'字符。这对二进制文件非常有效。真正的问题是你为什么要复制内存中的文件的内容,但你可以将原始缓冲区写出到一个新文件中。

6

strcpystrcmp用于C字符串,它是0终止的。如果您的视频文件具有值为0的任何字节,则它们将在此处停止。

您应该看看memcpymemcmp,而不是将缓冲区解释为0终止的字符串。