我正在使用此函数获得无限循环(在while循环中)。我是新手处理文件,所以我觉得我错过了一些东西......我看不出有什么问题。
void cipher(FILE* password_ptr,int n)
{
if (password_ptr == NULL)
{
printf("Error:password_ptr points to null");
return;
}
while(!feof(password_ptr))
{
fseek(password_ptr, 0, SEEK_CUR); // don't move
int en=fgetc(password_ptr)+n;
fseek(password_ptr, -1, SEEK_CUR); // move backwards one character
if(fputc(en,password_ptr)!=en)
{
printf("Error:fputc didn't work");
}
fseek(password_ptr, 0, SEEK_CUR);
}
fclose(password_ptr);
};
谢谢!
答案 0 :(得分:3)
调用fseek()
的副作用是文件上的EOF指示被清除:
C99 7.19.9.2/5 fseek功能:
在确定新位置后,成功调用fseek函数会撤消ungetc函数对流的任何影响, 清除文件结束指示 流,然后建立新的位置。
请注意,您的代码还使用由feof()
函数控制的循环的公共反模式。在 I / O操作到达那一点之后,该函数将不会返回EOF
,直到(设置文件结束指示符)。换句话说,即使进入循环,fgetc()
也可能由于位于文件末尾而失败(这将设置文件结束指示符)。但随后的搜寻将清除该指标。在此期间,您将对EOF
进行操作,就好像这是正常的,成功的阅读一样。
请参阅:
您可能希望尝试以下循环:
int c;
while((c = fgetc(password_ptr)) != EOF)
{
int en= c+n;
fseek(password_ptr, -1, SEEK_CUR); // move backwards one character
if(fputc(en,password_ptr)!=en)
{
printf("Error:fputc didn't work");
break;
}
}
您还需要考虑如何让这段代码处理en
超出unsigned char
范围的情况。由于fputc()
在将字符写入流之前将要写入的字符转换为unsigned char
,如果en
超出该范围,则会显示“fputc不起作用”错误。例如,如果向n
读取的字符添加fgetc()
大于255,则可能会发生这种情况。