- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在用 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/
大多数 fputc 的 C 文件编写示例使用非常基本的示例,很少或没有过程错误检查。 我应该将哪些错误检查技术和函数与 fputc 循环结合使用以确保 fputc 已成功写入文件?我应该如何使用它们?
我在编写的程序中看到了一些我无法真正解释的奇怪行为,我想知道是否有人可以向我解释这里发生的事情。我感觉这是由 g++ 与 -O3 一起使用的一些高级优化技术引起的,但我不确定。 我正在运行类似的东西(
我正在使用 fputc(在 C/C++ 中)将一些数据输出到文件中,文件大小对我的项目很重要。但是结果文件的大小似乎不正确,一个简单的代码示例: FILE *fp = fopen( "123.txt"
由于某种原因,当我尝试使用 fputc 通过管道写入时,我的程序无法工作;但是,当我使用 write 系统调用时它工作正常。这是我使用 fputc 的代码部分: FILE *input = f
我对 C 很陌生,我正在尝试使用 fputc() 在文件中存储整数。当我查看整数格式不同的文件时,该函数起作用。 例如: 1) fputc(ppm1->max, file1); ppm1->max 指
我 3 天前才开始学习 C,我正在尝试编写一个程序,它接收一个文件、读取字符并从中删除所有空格和制表符。我是一名初级程序员,在开始学习 C 之前只学习了一点 MATLAB。我使用的是 Ubuntu 1
#include int main() { FILE *fp; char ch = 'g'; fp = fopen("temp.txt", "r+"); while
我应该编写一个程序来获取文本文件(包含纯文本)并更正以下错误(涉及标点符号): Hello , there! --> Hello, there! Hello ,there! --> Hello, th
给定 unsigned char *str,一个 UTF-8 编码的字符串,用 fputc((char)(*str), file 写入第一个字节(不是字符)是否合法); 最佳答案 移除对 char 的
我有一个用 C 语言编写的小程序,它以一个菜单开始,该菜单在一个带有 do{switch{case 1....}while 循环的函数中实现 当案例 1 验证时,它调用另一个函数,其中 while 循
我有以下 C 函数: int vacateDir(const INODE *pParDirInode) { FILE *fp = fopen("fs560", "rb+"); if (fp =
当使用 fopen("/some/path", "r") 创建流时,我无法找到对 fputc() 指定行为的任何引用>. 我搜索了 C11 Draft n1570 pdf 寻找任何没有运气的引用,fo
我想更改文件的一个值,但以下代码根本不起作用。当我删除 if 语句时它可以正常工作。 代码如下: #include int main() { int b; FILE *fp;
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve th
我正在使用 C 语言编写基本的 fputc 应用程序。我正在编写/附加“.”在文件中使用 for 循环次数。但是,该文件显示的是垃圾字母而不是“。” . #include int main()
我正在尝试使用 fseek 转到文件中的特定位置并打印文本。但是当我使用 fputc 或 fwrite 时,它们会继续输入十六进制值而不是字符值。该文件是 .dat,最初用 0 填充。因此,除此之
getc() 与 fgetc() putc() 与 fputc() 它们之间的主要区别是什么? 我听说除了 getc() 可以用作宏之外,这两个函数的作用几乎相同。这是什么意思? 如果它们相同,为什么
我在使用 fputc 时遇到问题 - 也许有人可以提供帮助。我在开始时分配了一些存储空间,并分配给了 data[0] = 'B' 和 data[1] = 'M' - 数组的其余部分填充了数字。然后数据
int fputc(int c, FILE *stream); int fputs(const char *s, FILE *stream); 为什么在 fputc() 的声明中不需要 const i
我正在用 C 创建一个存档程序,我希望它保存我提供的文件,列出并提取它们。 我有很多问题,因为我使用文本文件进行保存,如果我想处理音乐或照片等二进制文件,这不是最佳选择,因为当我提取它们时,它们没有正
我是一名优秀的程序员,十分优秀!