编译器说:无法将int转换为FILE*

fud*_*din 1 c file

虽然做文件即时贴在这里.在while循环的条件不起作用.编译器说不能将int转换为FILE*.

while(pFile!=EOF);
Run Code Online (Sandbox Code Playgroud)

我应该将pFile指定为int吗?我试过了,但它没有用.谢谢提前.完整的代码是:

int main()
{
    char ch;
    char name[20];
    FILE *pFile;
    int score;
    pFile=fopen("database.txt","r");
    if(pFile!=NULL)
    {

         while(pFile!=EOF);
        {
        fscanf(pFile,"%c",ch);
        }
    }
    else
    printf("Cant open the file.......");
        fclose(pFile);
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

Jer*_*fin 5

首先,你希望使用while (!feof(pFile))-永远!这样做几乎不可避免地会导致错误,即从文件中读取的最后一个数据似乎被读取两次.它可以使它正常工作,但只能在循环中间添加另一个检查以在达到EOF时退出 - 在这种情况下,循环条件本身将永远不会被使用(即,另一个检查是那个实际上将完成退出循环的工作).

您通常要做的是在读取数据时检查EOF.不同的功能以不同的方式表示EOF.fgets通过返回NULL发出信号失败(包括EOF).大多数其他人(getc,fgetc等)确实返回EOF,所以你通常会得到这样的东西:

int ch;   // Note, this should be int, NOT char

while (EOF != (ch=getc(pFile)))
    process(ch);
Run Code Online (Sandbox Code Playgroud)

要么:

char buffer[MAX_LINE_SIZE];

while (fgets(buffer, sizeof(buffer), pFile))
    process(buffer);
Run Code Online (Sandbox Code Playgroud)

使用scanf,检查成功有点复杂 - 它返回成功转换的次数,因此您希望确保匹配您的预期.例如:

while (1 == fscanf(fPfile, "%d", &input_number))
   process(input_number);
Run Code Online (Sandbox Code Playgroud)

在这种情况下我使用了1因为我在格式字符串中指定了1个转换.但是,由于EOF以外的原因,转换也可能失败,所以如果这种情况失败,你会经常想要检查feof(pFile).如果它返回false,则执行类似读取行的其余部分,在警告消息中向用户显示,然后继续读取文件的其余部分的操作.