gpt4 book ai didi

c - 以二进制模式复制文件,为什么当我们读写一个字符变量时它不起作用?

转载 作者:太空宇宙 更新时间:2023-11-04 05:28:08 24 4
gpt4 key购买 nike

<分区>

以下程序旨在制作一个.exe 应用程序文件的副本。但只有一件小事决定了它是否确实为我提供了预期文件RealPlayer.exe 的正确副本 或给我一个损坏的文件。

我所做的是以二进制模式从源文件读取并以相同模式写入新副本。为此我使用变量ch。但是如果chchar 类型,我得到一个大小只有几个字节的损坏文件,而原始文件是 26MB。但是如果我更改 ch 的类型int,程序工作正常,并给我 RealPlayer.exe 大小 26MB 的精确副本。所以让我问两个由这个前提产生的问题。如果你能回答这两个部分,我将不胜感激:

1) 为什么将 char 类型用于 chint 类型却有效?什么是char 类型有问题吗?毕竟,它不应该从原始文件中逐字节读取(因为 char 本身就是一个字节)并将其逐字节写入新的副本文件?毕竟不是int 类型所做的,即从原始文件中读取 4 个字节,然后将其写入副本文件吗?为什么两者之间存在差异?

2) 如果我们对 ch 使用 char 类型,为什么文件比原始文件那么小?让我们忘记一个复制的文件开始损坏并关注大小的那一刻。为什么如果我们逐字符(或逐字节)复制大小这么小,但当我们复制“整数”时大小(原始大小)按整数”(或 4 字节乘 4 字节)?

一位 friend 建议我停止提问并使用 int 因为它有效而 char 无效!!但我需要了解发生了什么在这里,我发现我对此事的理解存在严重失误。非常需要您的详细答案。谢谢。

#include<stdio.h>
#include<stdlib.h>

int main()
{
char ch; //This is the cause of problem
//int ch; //This solves the problem
FILE *fp,*tp;

fp=fopen("D:\\RealPlayer.exe","rb");
tp=fopen("D:\\copy.exe","wb");
if(fp==NULL||tp==NULL)
{
printf("Error opening files");
exit(-1);
}

while((ch=getc(fp))!=EOF)
putc(ch,tp);

fclose(fp);
fclose(tp);

}

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