6

我正在用 C 创建一个存档程序,我希望它保存我提供的文件,列出并提取它们。
我有很多问题,因为我使用文本文件进行保存,如果我想处理音乐或照片等二进制文件,这不是最佳选择,因为当我提取它们时,它们没有正确执行(它们已损坏)。为了解决这个问题,我想创建一个二进制存档文件。

文件写入代码(提取时)如下:

void scriviFile(const char * arrivo)                                //scrive i file creati in precedenza
{
    FILE * partenza;
    FILE * target;
    int c;
    int spazio = 'a';
    int i = 0;
    int pos;
    char * path;
    path = collegaSlash(getcwd(NULL, 0), nome);
    partenza = fopen(path, "rb");
    fseek(partenza, inizio, SEEK_SET);
    target = fopen(arrivo, "wb");                                           //apro il file
    if (target) {                                                               //se è aperto
        while ((c = fgetc(partenza)) != EOF && ftell(partenza)<=fine-10) {                                  //e il carattere preso non eccede la fine del file
            fputc(c, target);
            fputc(c, stdout);
            pos = ftell(partenza);
            if(pos==fine)
            {
                break;
            }
                                                                            //scrivo lo stesso carattere in out (file in uscita)
        }                                                                   //

        fclose(target);                                                     //chiudo il file
        fclose(partenza);
    } 
    else 
    {
        printf("errore di scrittura del file \n");
    }

}

由于我需要正确提取二进制文件,我可以使用上面编写的代码,还是必须使用and更改所有fgetc()fputc()函数?fread()fwrite()

谢谢

4

2 回答 2

12

您正在使用fgetc()fputc()正如您从手册页描述中看到的这些功能:

fgetc() 从流中读取下一个字符,并将其作为 unsigned char 转换为 int 或文件末尾的 EOF 或错误返回。

fputc() 将转换为无符号字符的字符 c 写入流。

C 中的字符由标准定义为始终恰好是 1 字节(8 位),这意味着当您fxxxc()在文件上使用时,您将获得 1 字节(恰好是文本文件中的字符)。

如果您逐字节提取并重建二进制文件,您将获得完全相同的副本。所以不,在二进制文件类型上使用fgetc()和没有问题。fputc()您总是可以通过一个简单的示例程序向自己证明这一点......例如:

int main()
{
    FILE * fptr = fopen("small_pic.jpg", "rb");  // open existing binary picture
    char buffer[10000] = {0}; // the pic is 6kb or so, so 10k bytes will hold it
    FILE * fptr2 = fopen("new_small_pic.jpg", "wb"); // open a new binary file 
                                                       // for our copy of the pic
    unsigned long fileLen;
    unsigned long counter;

    fseek(fptr, 0, SEEK_END);
    fileLen=ftell(fptr);      // get the exact size of the pic
    fseek(fptr, 0, SEEK_SET);

    for(counter=0; counter<fileLen; counter++)
        fputc(fgetc(fptr),fptr2);  // read each byte of the small_pic.jpg and make
                                           // a new pic from it

    fclose(fptr);
    fclose(fptr2);
return 0;
}

最终结果:我们有两个完全相同的图像,因为fgetc()fputc()可以用于二进制文件。

于 2013-05-10T12:59:21.690 回答
0

我正在用 C 创建一个存档程序,我希望它保存我提供的文件,列出并提取它们。我有很多问题,因为我使用文本文件进行保存,如果我想处理音乐或照片等二进制文件,这不是最佳选择,因为当我提取它们时,它们没有正确执行(它们已损坏)。为了解决这个问题,我想创建一个二进制存档文件。

--剪辑--

由于我需要正确提取二进制文件,我可以使用上面编写的代码,还是必须用 fread() 和 fwrite() 更改所有 fgetc() 和 fputc() 函数?

在二进制模式下工作时,您可以使用上面编写的代码。它与fgetc,fputc和无关。在文本模式下工作时,此函数不能特别好地工作的原因是,除了返回到该位置之外,不能保证对任何其他东西都有用,因此代码在处理以文本模式打开的文件时并不是特别适合。通过重构代码,您可以删除和处理大于 4GB 的文件……但这不应该是重构此代码的唯一原因。freadfwriteftellfseekftell(partenza)<=fine-10ftell

于 2013-05-10T16:18:29.290 回答