读取文件时无限循环

时间:2012-03-04 03:52:59

标签: c file infinite-loop

我正在使用此函数获得无限循环(在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);
};

谢谢!

1 个答案:

答案 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,则可能会发生这种情况。