【问题标题】:c strcpy a file descriptorc strcpy 一个文件描述符
【发布时间】:2011-01-11 13:15:52
【问题描述】:

我对 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);

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

【问题讨论】:

  • 您是否尝试过以二进制模式打开视频文件?
  • 简短的健全性检查:为什么要复制内存中的文件内容?完全没有必要这样做,因为文件内容可以直接写入读取缓冲区的内容
  • 你确定你做的一切都正确吗? str* 函数旨在处理以空字符结尾的(文本)字符串,而文件内容则不是。例如,如果读取文件中有'\0' 字符,那么它不会被完全复制(除非它是最后一个字符),但如果没有'\0',你会得到未定义的行为(甚至崩溃或奇怪的消息或.. .)。先看memcpymemcmp等类似功能。

标签: c file io strcpy


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 好吧,如果我将原始缓冲区写入文件,我将如何检查它,即写入文件的缓冲区与从文件读取的原始数据相同?
    • 对照您读取的同一个缓冲区检查缓冲区是没有意义的。如果它们不一样,那么您的程序中有错误(或者您的硬件已损坏),并且尝试检测您自己的错误将是相当具有挑战性的。您编写的程序应该执行的检查是 1. read() 的返回值。你想检测 EOF 或任何错误,你想检查你是否真的阅读了整个文件。 2.write的返回值,你要检查你是否真的写了整个文件。
    • 如果需要验证写入的数据是否与原文件相同,则需要将新文件读回并与旧文件进行比较。如果在写入数据之前进行比较,可能会在写入时出现问题,并且您无论如何都不会发现它。
    猜你喜欢
    • 2018-08-15
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    • 2010-09-08
    • 1970-01-01
    相关资源
    最近更新 更多