Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
(C) 如何检查文件是否已结束_C - Fatal编程技术网

(C) 如何检查文件是否已结束

(C) 如何检查文件是否已结束,c,C,我已经做了很多研究,但在我的程序中找不到真正有效的东西。我发现的最好的方法(AKA,唯一一种有效的方法)是在文本文件中添加一个备用字符来读取,并检查文件是否以此结束,但我必须读取其他文件并检查它们是否结束,而同样的方法根本不适用于这些其他文件,因此我需要一个更好的方法来实际工作。现在我正在尝试下面看到的这个方法(使用feof),但它什么也不做,程序会转到那个if,检查它是否不是文档的结尾并再次循环,即使在文件结束后也会继续这样做 int main(){ FILE *contas; //p

我已经做了很多研究,但在我的程序中找不到真正有效的东西。我发现的最好的方法(AKA,唯一一种有效的方法)是在文本文件中添加一个备用字符来读取,并检查文件是否以此结束,但我必须读取其他文件并检查它们是否结束,而同样的方法根本不适用于这些其他文件,因此我需要一个更好的方法来实际工作。现在我正在尝试下面看到的这个方法(使用feof),但它什么也不做,程序会转到那个if,检查它是否不是文档的结尾并再次循环,即使在文件结束后也会继续这样做

int main(){
    FILE *contas; //ponteiro do arquivo onde as contas estão salvas
    contas = fopen("Contas.txt","r"); //abre arquivo onde as contas estão salvas
    system("color F0"); //altera a cor da fonte e do background
    setlocale(LC_ALL, "portuguese"); //define a língua utilizada pelo programa
    
do{
    system("cls"); //limpa a tela
    printf("\n\n\tBem-vindo! Por favor, insira o seu login e a sua senha.");
    printf("\n\tLogin: ");
    scanf("%s", login); //recebe o login inserido pelo usuario
    printf("\tSenha: ");
    scanf("%s", senha); //recebe a senha inserida pelo usuario
    
    do{
        fscanf(contas,"%s %s",loginSalvo,senhaSalva); //lê o arquivo, login/senha por login/senha
        if(strcmp(login,loginSalvo) == 0 && strcmp(senha,senhaSalva) == 0){ //compara login/senha inserido com o login/senha do arquivo
            printf("\tLogin efetuado com sucesso!\n\t");
            system("pause");
            verificacaoValidez = 1;
        }else{
            if(feof(stdin)){ //verifica se o arquivo inteiro já foi lido
                printf("\tLogin e/ou senha incorretos, tente novamente\n\t");
                system("pause");
                break;
            }
        }
    }while(verificacaoValidez != 1); //repete enquanto o login/senha estiver incorreto
}while(verificacaoValidez != 1); //repete enquanto o login/senha estiver incorreto

fclose(contas); //fecha arquivo das contas
}

多亏了@Eric Postdischill,我找到了解决方法,只需为
fscanf
分配一个int,然后在该int中验证它是否为EOF。问题是,我的老师从来没有真正教过fscanf是如何工作的,他只是简单地给我们这个命令作为阅读文件的工具(实际上,他根本没有解释它,但不管怎样)。以下是代码,适用于任何有相同问题的人:

do{
        int t = fscanf(contas,"%s %s",loginSalvo,senhaSalva); //lê o arquivo, login/senha por login/senha
        if(strcmp(login,loginSalvo) == 0 && strcmp(senha,senhaSalva) == 0){ //compara login/senha inserido com o login/senha do arquivo
            printf("\tLogin efetuado com sucesso!\n\t");
            system("pause");
            verificacaoValidez = 1;
        }else if(t == EOF){ //verifica se o arquivo inteiro já foi lido
            printf("\tLogin e/ou senha incorretos, tente novamente\n\t");
            system("pause");
            break;
        }
    }while(verificacaoValidez != 1); //repete enquanto o login/senha estiver incorreto
}while(verificacaoValidez != 1); //repete enquanto o login/senha estiver incorreto

fscanf
返回一个结果。你的陈述
fscanf(…)忽略该结果。相反,保存结果,如
intt=fscanf(…)。如果结果是
EOF
fscanf
在完成任何转换之前遇到文件结尾或I/O错误。如果结果等于您请求的转换次数(通过一些特殊情况进行修改,您现在可以忽略这些情况),
fscanf
读取并分配您请求的所有内容。否则,
fscanf
在输入中发现与某个转换不匹配的内容。请使用
while(fscanf(…)==2)
。如果出现错误、EOF或输入与格式不匹配,循环将停止。请注意,当一次转换完成后但在所有转换完成之前到达文件结尾时,
fscanf
将返回执行的分配数。然后下一次调用
fscanf
将返回
EOF
@EricPostpischil fscanf用于实际读取loginSalvo和senhaSalva的文件,然后我使用它们与用户插入的登录名和senha(密码)进行比较。@Barmar是的,但如果循环中断,整个程序就会中断,它必须在循环内验证是否达到EOF,然后说“登录失败”,然后循环回登录屏幕。如果我在循环中断后让它说“登录失败”,即使成功,它也会说“登录失败”