gpt4 book ai didi

我可以在二进制文件中使用 fgetc() 或 fputc() 吗?

转载 作者:太空狗 更新时间:2023-10-29 15:20:03 26 4
gpt4 key购买 nike

我正在用 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");
}

}

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

谢谢

最佳答案

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

fgetc() reads the next character from stream and returns it as an unsigned char cast to an int, or EOF on end of file or error.

fputc() writes the character c, cast to an unsigned char, to stream.

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() 可用于二进制文件。

关于我可以在二进制文件中使用 fgetc() 或 fputc() 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16479006/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com