You need to enable JavaScript to run this app. C语言读取文件内容存入变量并完成值比对的实现方法
优惠活动
大模型
产品
解决方案
定价
更多

C语言读取文件内容存入变量并完成值比对的实现方法

可直接实现文件读取+登录比对的完整方案

你现有代码的核心问题点

  • 错误重定义标准fgets:C语言不允许在main函数内部嵌套定义自定义函数,而且你改写的fgets根本没有实际读文件的操作,只是直接返回传入的参数,完全达不到从文件读内容的目的
  • 字符串不能直接用相等符号比对:C语言中数组名代表的是数组的首地址,直接写email == emailx比对的是两个内存地址,永远不可能相等,这也是你代码跑不起来的核心原因之一
  • 输入读取逻辑错误:scanf("%c", &email)中%c是用来读取单个字符的,email本身是字符数组(首地址),传参类型不匹配会造成内存非法访问
  • 变量作用域错误:你定义的emailx是写在那个无效的嵌套函数内部的局部变量,main函数的循环逻辑里根本访问不到这个变量,所以才会报“emailx未声明”的编译错误
  • 缺少文件打开错误判断:如果txt文件路径不对、被占用,fopen会返回空指针,这时候直接操作文件会直接导致程序崩溃

可直接运行的完整实现

准备工作

在你存放C语言代码的同目录下,新建两个纯文本文件:

  • admin_email.txt:内部直接写入预设的管理员邮箱(比如admin@school.com),写完不要多按多余的回车
  • admin_pwd.txt:内部直接写入预设的管理员密码(比如admin2024),同样不要留多余空行

核心代码

#include <stdio.h>
#include <string.h>
#define MAX_EMAIL_LEN 30
#define MAX_PWD_LEN 16

int main()
{
    // 打开存了预设账号信息的文件
    FILE *email_file = fopen("admin_email.txt", "r");
    FILE *pwd_file = fopen("admin_pwd.txt", "r");

    // 检查文件是否正常打开
    if(email_file == NULL || pwd_file == NULL) {
        printf("预设账号文件缺失,请检查同目录下的txt文件\n");
        return 1;
    }

    // 定义变量存储从文件读出来的预设账号信息
    char stored_email[MAX_EMAIL_LEN] = {0};
    char stored_pwd[MAX_PWD_LEN] = {0};
    fgets(stored_email, MAX_EMAIL_LEN, email_file);
    fgets(stored_pwd, MAX_PWD_LEN, pwd_file);
    fclose(email_file);
    fclose(pwd_file);

    // 去掉fgets自动读入的末尾换行符,避免比对失败
    int e_len = strlen(stored_email);
    if(e_len > 0 && stored_email[e_len-1] == '\n') {
        stored_email[e_len-1] = '\0';
    }
    int p_len = strlen(stored_pwd);
    if(p_len > 0 && stored_pwd[p_len-1] == '\n') {
        stored_pwd[p_len-1] = '\0';
    }

    // 循环等待用户输入,直到输入信息和文件存储的内容完全匹配
    char input_email[MAX_EMAIL_LEN] = {0};
    char input_pwd[MAX_PWD_LEN] = {0};
    do {
        printf("请输入管理员邮箱:");
        scanf("%29s", input_email);
        // 清空输入缓冲区残留内容,避免下次读取出错
        while(getchar() != '\n');

        printf("请输入管理员密码:");
        scanf("%15s", input_pwd);
        while(getchar() != '\n');

        // 用strcmp做字符串相等比对,返回0代表两个字符串完全一致
        if(strcmp(input_email, stored_email) == 0 && strcmp(input_pwd, stored_pwd) == 0) {
            printf("登录成功!\n");
            break;
        } else {
            printf("邮箱或密码错误,请重新输入\n");
        }
    } while(1);

    return 0;
}

作业核心逻辑说明

  • 从文件读内容的逻辑:直接调用C语言标准库的fgets(存储变量, 变量最大长度, 文件指针)即可,不需要自己编写读文件的函数,就能把txt里的字符内容读到定义好的数组变量里
  • 字符串比对的逻辑:必须引入string.h头文件,通过strcmp()函数完成两个字符串的相等判断,绝对不能直接用==/!=比对数组名
  • 常见隐形bug规避:用记事本存txt文件时,敲完内容的回车会被fgets一起读入变量,需要手动把末尾的换行符替换成字符串结束符,否则哪怕输入内容完全正确,也会因为多了个换行符导致比对失败

内容的提问来源于stack exchange,提问作者0m3rk4

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.10 00:57:04