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

C++使用ofstream创建txt文件未生成问题及代码优化求助

问题原因解析
  • 工作目录不匹配:程序生成的txt文件默认保存在程序运行的工作目录,而非源代码所在目录。如果使用IDE运行,工作目录通常是项目工程文件所在文件夹,或是编译生成的exe文件同目录,可优先到这两个路径下查找生成的文件。
  • 文件名包含非法字符:如果输入的用户名包含/ \ : * ? " < > |这类操作系统禁止出现在文件名中的字符,会导致文件创建失败。ofstream默认不会抛出该类错误,因此代码运行无报错但不会生成文件。
  • 写入权限不足:如果程序在系统级受保护目录(如C盘根目录、Program Files文件夹)下运行,没有写入权限时也会创建文件失败,可将编译出的exe移动到普通用户目录下运行验证。
  • 额外隐藏逻辑bug:登录逻辑中cin >> password执行后输入流会残留换行符,后续调用getline读取文件内容前没有清理残留的换行符,会导致第一行读取到空字符串,即便文件存在也会出现匹配失败的问题。
核心修复代码

在创建文件时增加成功判断,可快速定位文件创建失败的问题:

ofstream file(username + ".txt");
if(!file.is_open()) {
    cout << "文件创建失败,请检查用户名是否合法、路径是否有写入权限" << endl;
    system("pause");
    return 1;
}

登录逻辑前清理输入流残留的换行符:

cout << "Enter password: "; cin >> password;
cin.ignore(); // 吃掉输入流残留的换行符
ifstream readf(username + ".txt");
getline(readf, name);
getline(readf, pass);
代码优化建议
  • 替换main函数递归:C++标准禁止显式调用main函数,递归调用次数过多还会引发栈溢出,可使用while(true)循环包裹主菜单逻辑,需要退出时直接break即可。
  • 移除using namespace std;:入门阶段使用虽然简便,但实际开发中容易引发命名冲突,建议使用std::cout、std::string这类带命名空间的写法。
  • 替换system("pause"):该方法仅适配Windows系统,跨平台性差,可改为cout << "按回车键继续"; cin.get();实现相同效果。
  • 增加非法输入处理:当前用户输入非1/2的选项时代码会直接退出,可增加else分支提示输入错误,自动返回主菜单。
  • 密码加密存储:当前明文存储密码安全性极低,入门阶段可简单实现字符偏移加密,写入时将密码每个字符ASCII码加固定值,验证时反向偏移即可。
完整优化后代码
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

bool isLoggedIn(){
    string username, password, name, pass;
    cout << "Enter username: "; 
    cin >> username;
    cout << "Enter password: "; 
    cin >> password;
    cin.ignore();

    ifstream readf(username + ".txt");
    if(!readf.is_open()) {
        cout << "用户不存在" << endl;
        return false;
    }
    getline(readf, name);
    getline(readf, pass);

    return (name == username && pass == password);
}

int main()
{
    while(true) {
        int choice;
        cout << "1. Register | 2. Login | 3. Exit\nChoose: "; 
        if(!(cin >> choice)) {
            cout << "请输入有效数字" << endl;
            cin.clear();
            cin.ignore(1024, '\n');
            continue;
        }

        if(choice == 1){
            string username, password;
            cout << "Create username: "; 
            cin >> username;
            cout << "Create password: "; 
            cin >> password;
            cin.ignore();

            ofstream file(username + ".txt");
            if(!file.is_open()) {
                cout << "注册失败:用户名包含非法字符或无写入权限" << endl;
                continue;
            }
            file << username << endl << password;
            file.close();
            cout << "注册成功" << endl;
        } else if(choice == 2){
            bool status = isLoggedIn(); 
            if(!status){
                cout << "Login failed" << endl;
            } else {
                cout << "Login successful" << endl;
            }
            cout << "按回车键继续..." << endl;
            cin.get();
        } else if(choice == 3) {
            cout << "退出程序" << endl;
            return 0;
        } else {
            cout << "请输入1-3之间的数字" << endl;
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 22:06:08