gpt4 book ai didi

c++ - 如何从 getc 读取过去的 EOF?

转载 作者:行者123 更新时间:2023-11-30 02:50:04 24 4
gpt4 key购买 nike

我正在编写一个 XOR 加密程序,它在加密期间工作正常,但在解密期间工作正常

char ca2=fgetc(f);

卡在一个点上,之后没有解密发生,我对该问题的最佳猜测是(加密文件包含各种字符)一旦 fgetc 到达 EOF 标记,该标记可能出现在文件的实际结尾之前它卡在那里并停止阅读下一个字符。

这是 getc() 的某种限制吗?这是我的垃圾代码

int get_file_size(char  filename[]) 
{
FILE *p_file = NULL;
p_file = fopen(filename,"rb");
fseek(p_file,0,SEEK_END);
int size = ftell(p_file);
fclose(p_file);
return size;
}

int endec(char filename[],char psdw[])
{
FILE *f;
int hashed=0,ed=0;
int inphash=inhash(psdw);
inphash=inphash%50;
f=fopen(filename,"r");
if(f==NULL)
printf("failed");

char temps[999999];
long int crs=0,j=0;
int filesz=get_file_size(filename);
printf("file size = %d\n\n",filesz);
while(1){

inphash=inphash+2;
char ca=(char)inphash;
char ca2=fgetc(f);
printf("%c\n",ca2);
if(crs>=filesz)
break;
temps[crs]= ca2 ^ ca;
crs++;

}
fclose(f);
printf("%d",strlen(temps));

FILE *fp;
fp=fopen(filename,"wt");
for(j=0;j<crs;j++){
putc (temps[j] , fp);
printf("%c",temps[j]);

}
fclose(fp);
}

最佳答案

你的问题就在这里:

f=fopen(filename,"r");

您打开文件是为了文本阅读,而不是二进制文件。你的文件大小函数是正确的,但你的解码器函数没有。

使用 C 风格的 IO 例程逐字符读取文件的惯用方法是这样的:

f = fopen(filename, "rb");

if (!f)
// handle error

int c; // NOTE: int, not char!

while ( (c = fgetc(f)) != EOF )
{
// do something with 'c'
}

这个习惯用法要求您将获取文件大小作为一个单独的操作。您可以使用上述形式的简单循环重写 XOR“加密”例程。它将更加清晰和简洁。

您的整个解码器函数可以重写如下:(减去调试代码)

int endec(char filename[], char psdw[])
{
int inphash = inhash(psdw) % 50;
char temp[999999]; // really, should be std::vector<char>
FILE *f;

if ( (f = fopen(filename, "rb")) == NULL )
{
printf("opening for read failed\n");
return -1;
}

size_t crs = 0;
int c;

while ( (c = fgetc(f)) != EOF )
{
inphash += 2;
temp[crs++] = (char)(inphash ^ c);
}
fclose(f);

if ( (f = fopen(filename, "wt")) == NULL )
{
printf("opening for write failed\n");
return -1;
}

if (fwrite(temp, crs, 1, f) != crs)
{
printf("short write\n");
fclose(f);
return -1;
}

fclose(f);
return 0;
}

不是出色的错误处理,但它是错误处理。

关于c++ - 如何从 getc 读取过去的 EOF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20757961/

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