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

ATM登录系统多用户登录后重复打印异常问题求助

ATM登录问题:第二个用户登录时同时显示「Invalid login」

问题背景

我有一个用户信息文本文件,格式如下:

jack carruthers/2006 
150 

oliver daniels/0000
10

用户需输入「姓名/Pin」格式内容登录,登录成功后可执行各类操作,数字为用户余额。添加第二个用户前无异常,但登录第二个用户时,虽能正常打印余额,却同时输出「Invalid login」,尝试多种文件读取方式均未解决。

我的代码

# Jack Carruthers
# ATM 

file_path = "user_inf.txt"


def login():
    global line_num # 全局化行号,用于后续读取/修改用户余额
    info = input("Enter login in format:\n Name/Pin \n") 
    with open(r"C:\T-Level Digital Production\Library\atm_1\atm_1\user_inf.txt", "r") as fp: # 用户信息文件路径
        
        for line_num, line in enumerate(fp):  # 将line_num与文件行号绑定
            if (info) in line:  # 如果用户输入内容存在于当前行
                print("Login successful\n") 
                main() # 登录成功后运行主程序
                balance() 
                
                break  # 跳出循环避免输出无效登录提示
                        
            else:
                print("Invalid login, please try again")

def balance():
    with open(r"C:\T-Level Digital Production\Library\atm_1\atm_1\user_inf.txt", "r") as fp:    
        lines = fp.readlines()
        global balances
        balances = lines[line_num + 1].strip() # 读取余额所在行
        print("Your balance is:\n")
        print(balances, "GBP")


def withdraw():
    pass


def deposit():
    pass


def end():
    pass

def main():     
    pass


login()

问题现象

登录第二个用户时,余额能正常打印,但同时弹出「Invalid login」提示。


问题原因

login函数的循环逻辑有问题:遍历文件每一行时,只要当前行不匹配输入内容,就立刻打印错误提示。比如登录oliver daniels/0000时,循环先读到第一行jack carruthers/2006,不匹配就输出错误;接着读到空行,还是不匹配又输出一次;直到读到第三行匹配才执行登录成功逻辑,但之前的错误提示已经输出了。

修复方法

修改login函数,先遍历完所有行确认无匹配项后,再输出错误提示:

def login():
    global line_num
    info = input("Enter login in format:\n Name/Pin \n")
    found = False  # 标记是否找到匹配用户
    with open(r"C:\T-Level Digital Production\Library\atm_1\atm_1\user_inf.txt", "r") as fp:
        for line_num, line in enumerate(fp):
            # 两边去除空白字符,避免换行、空格影响匹配
            if info.strip() in line.strip():  
                print("Login successful\n")
                main()
                balance()
                found = True
                break
    # 循环结束后统一判断是否登录失败
    if not found:
        print("Invalid login, please try again")

额外优化建议

  1. 匹配时使用strip()去除输入和文件行的空白字符,避免因换行、空格导致匹配失败;
  2. 目前main()函数为空,调用无实际作用,可考虑移除或补充功能逻辑。

内容的提问来源于stack exchange,提问作者Jack Carruthers

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 10:57:49