2013-05-10 61 views
3

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

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

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"); 
    } 

} 

因为我需要二进制文件,以正确地提取,我可以使用的代码,我写了上面,还是我必须改变所有fgetc()fputc()功能与fread()fwrite()

感谢

+1

是的,你应该改变,或者你可能花费大量的时间用调试器发现你的fget得到了一些无效值并且造成了破坏 – abasu 2013-05-10 09:27:23

+0

当读写一个字母来打开一个二进制文件时没有问题。 – BLUEPIXY 2013-05-10 09:35:24

+1

@abasu你在说什么?我在这里看到使用'fgetc'没有问题。停止误诊。我确实看到了几个未声明的变量的用法。出于这个原因,我们不能帮助AndreaGottardi与此代码。 AndreaGottardi:创建一个最小的可编译测试用例,将结构中的信息(不一定是'struct')写入文件。然后创建一个最小的,可编译的测试用例,将文件中的信息读取到结构中。在这里提供他们两个,但只有在他们实际编译时...提出一个关于你不明白的东西的问题...... – Sebivor 2013-05-10 09:38:24

回答

8

您使用fgetc()fputc(),你可以从该名男子页面描述看到这些功能:

龟etc()从流中读取下一个字符,并将它作为一个无符号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()可以在二进制文件中使用。

0

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

--SNIP--

因为我需要二进制文件,以正确地提取,可我使用的代码,我 上面写的,还是我不得不改变所有的龟etc()和fputc()函数的功能 用fread ()和fwrite()?

在二元模式下工作时,您可以使用上面编写的代码。它与fgetcfputc,freadfwrite无关。此功能在文本模式下工作时效果不佳的原因是ftell不保证对除fseek以外的任何内容有用,因此在处理打开的文件时代码ftell(partenza)<=fine-10不是特别合适文本模式。通过重构您的代码,您可以删除ftell并处理大于4GB的文件......但这不应该是重构此代码的唯一原因。

相关问题