如何从 getc 阅读过去的 EOF
How to read past EOF from getc?
我正在编写一个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 = %dnn",filesz);
while(1){
inphash=inphash+2;
char ca=(char)inphash;
char ca2=fgetc(f);
printf("%cn",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 failedn");
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 failedn");
return -1;
}
if (fwrite(temp, crs, 1, f) != crs)
{
printf("short writen");
fclose(f);
return -1;
}
fclose(f);
return 0;
}
不是出色的错误处理,但它是错误处理。
相关文章:
- 如何确定我已使用非编码文件到达 EOF?
- 删除映射和分割错误中的一个过去结束元素
- std::ifstream::read 不会读取所有 512 字节,并设置 EOF 和失败位
- C++如何在多次执行后记住过去给出的输入
- 而(!inputfile.eof())只读取第一行?
- EOF有更安全的替代方案吗?它在我的情况下不起作用
- "错误 C0000:语法错误,令牌"<EOF>"处出现意外$end,并且不确定
- 计算过去 60 秒的最低和最高温度
- 如何在 EOF 之前从文件中读取并将其放入字符串中?
- 如何在从文件中读取整数时使用 file.eof()?
- "eof"可以设置为流吗?
- 吃完 EOF 后重复使用 std::cin
- 文件处理,eof() 定义
- std::cin 在读取 EOF 并清除后不再读取
- 为什么 EOF 在循环扫描期间没有终止?
- 延迟函数使打开的框架窗口冻结,直到指定的时间过去
- sleep_until过去的时间点
- cin.clear()是否保留EOF
- 如何从 getc 阅读过去的 EOF
- 你能通过查看过去的EOF来创建未定义的数据吗