You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用fscanf读取文本文件异常,登录验证失败求助

登录验证失败问题排查与修复

你遇到的核心问题是代码存在多处指针传参、循环逻辑错误,导致fscanf读取内容异常,登录验证失效。先看你的原代码和文本文件内容:

原代码

case 1:;
    char username[50];
    char password[50];
    char nameCheck[50];
    char pwordCheck[50];
    FILE *fp;
    fp = fopen("AdminLogin.txt", "rb");
    rewind(fp);
    printf("Enter your username: ");
    scanf("%s", &username);
    printf("Enter your password: ");
    scanf("%s", &password);

    while (Admin == false) {
        fscanf(fp, "%s %s ", &nameCheck, &pwordCheck);
        printf("%s %s ", &nameCheck, &pwordCheck);
        if (strcmp(username, nameCheck) == 0 && strcmp(password, pwordCheck) == 0) {
            printf("Login successful!\n");
            bool Admin = true;
            break;
        } else {
            printf("Login failed.\n");
        }
        fclose(fp);
        break;
    }
}

文本文件内容

John@gmail.com 1234567
George@gmail.com 1299123

错误点分析

  • 数组传参错误:C语言中数组名本身就是指向首元素的指针,scanf、fscanf、printf传数组时不需要加&。加&后传递的是数组的二级指针,会导致内存读写混乱,这就是printf显示“流而非字符串”的直接原因。
  • 文件打开模式错误:用"rb"二进制模式打开文本文件,会导致换行符等文本格式处理异常,应该用"r"文本模式。
  • 循环逻辑完全错误:
    • 循环内只读取一行就执行fclose(fp)和break,根本没机会检查第二行的账号;
    • 验证成功时定义了局部变量bool Admin = true;,这会屏蔽外部的Admin变量,导致循环外的Admin状态不会改变;
  • 未检查文件打开结果:如果文件不存在或权限不足,fopen会返回NULL,后续操作会直接崩溃。

修复后的代码

#include <stdio.h>
#include <string.h>
#include <stdbool.h>

bool Admin = false; // 假设Admin为外层已定义的变量

int main() {
    int choice = 1;
    switch(choice) {
        case 1: {
            char username[50];
            char password[50];
            char nameCheck[50];
            char pwordCheck[50];
            
            FILE *fp = fopen("AdminLogin.txt", "r");
            if (fp == NULL) {
                printf("Failed to open file!\n");
                break;
            }

            printf("Enter your username: ");
            scanf("%s", username);
            printf("Enter your password: ");
            scanf("%s", password);

            // 遍历文件所有行查找匹配项
            while (fscanf(fp, "%s %s", nameCheck, pwordCheck) == 2) {
                printf("Checking: %s %s\n", nameCheck, pwordCheck);
                if (strcmp(username, nameCheck) == 0 && strcmp(password, pwordCheck) == 0) {
                    printf("Login successful!\n");
                    Admin = true;
                    break;
                }
            }

            if (!Admin) {
                printf("Login failed.\n");
            }

            fclose(fp);
            break;
        }
    }
    return 0;
}

修复说明

  1. 所有数组传参去掉&,确保传递正确的首元素地址;
  2. 改用"r"模式打开文本文件,适配文本格式处理;
  3. 调整循环逻辑:用fscanf返回值判断是否成功读取一行(返回2表示成功读取两个字符串),遍历所有行直到找到匹配项或文件结束;
  4. 验证成功时直接修改外部Admin变量,避免局部变量屏蔽;
  5. 增加文件打开失败检查,增强程序健壮性;
  6. 将文件关闭操作移到循环结束后,确保所有行都能被读取。

内容的提问来源于stack exchange,提问作者Paranoid Android

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 20:00:16