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

咨询:基于C++ fstream的非易编辑保存文件格式推荐

适合的文件类型及C++实现方案

嘿,针对你的需求,我给你推荐几个适合用C++ fstream读写、且普通用户很难直接编辑的文件类型,都是实际项目里常用的方案:

1. 自定义二进制文件(推荐后缀:.dat、.bin、.userdb)

这是最直接高效的选择——把用户的用户名和密码以二进制形式写入文件。普通用户用记事本、Notepad++这类文本编辑器打开,看到的只会是一堆乱码,根本没法识别和修改内容。用fstream可以轻松实现完整的读写逻辑:

代码示例:

首先定义一个存储用户信息的结构体(用固定长度字符数组避免序列化问题):

#include <fstream>
#include <string>
#include <cstring>
#include <iostream>

struct UserInfo {
    char username[50];  // 限制用户名最长49字符,留一位存结束符
    char password[50];
};

写入用户信息到文件:

void saveUser(const std::string& username, const std::string& password) {
    // 以二进制追加模式打开文件
    std::ofstream outFile("users.dat", std::ios::binary | std::ios::app);
    if (!outFile.is_open()) {
        std::cerr << "无法打开文件进行写入!" << std::endl;
        return;
    }

    UserInfo info;
    // 安全复制字符串到结构体数组
    strncpy(info.username, username.c_str(), sizeof(info.username) - 1);
    info.username[sizeof(info.username) - 1] = '\0';
    strncpy(info.password, password.c_str(), sizeof(info.password) - 1);
    info.password[sizeof(info.password) - 1] = '\0';

    // 写入二进制数据
    outFile.write(reinterpret_cast<const char*>(&info), sizeof(UserInfo));
    outFile.close();
}

读取文件中的用户信息:

void loadAllUsers() {
    std::ifstream inFile("users.dat", std::ios::binary);
    if (!inFile.is_open()) {
        std::cerr << "无法打开文件进行读取!" << std::endl;
        return;
    }

    UserInfo info;
    // 循环读取每个用户的二进制数据
    while (inFile.read(reinterpret_cast<char*>(&info), sizeof(UserInfo))) {
        std::cout << "用户名:" << info.username << " | 密码:" << info.password << std::endl;
    }
    inFile.close();
}

2. 加密二进制文件(推荐后缀:.enc、.sec)

如果想进一步提升安全性,防止用户用二进制编辑器瞎改数据,可以给存储的内容做一层简单的对称加密(比如异或加密)。读写时分别进行加密和解密,fstream完全能支持,而且普通用户就算拿到文件也很难破解内容:

代码示例(异或加密):

先实现一个简单的异或加密函数:

// 异或加密/解密(异或两次就能还原数据)
void xorCipher(char* data, size_t dataLength, char key) {
    for (size_t i = 0; i < dataLength; ++i) {
        data[i] ^= key;
    }
}

加密写入用户信息:

void saveEncryptedUser(const std::string& username, const std::string& password) {
    std::ofstream outFile("users.enc", std::ios::binary | std::ios::app);
    if (!outFile.is_open()) {
        std::cerr << "无法打开加密文件进行写入!" << std::endl;
        return;
    }

    UserInfo info;
    strncpy(info.username, username.c_str(), sizeof(info.username) - 1);
    info.username[sizeof(info.username) - 1] = '\0';
    strncpy(info.password, password.c_str(), sizeof(info.password) - 1);
    info.password[sizeof(info.password) - 1] = '\0';

    // 自定义加密密钥,可根据需求修改
    char encryptKey = 'K';
    // 对结构体数据进行加密
    xorCipher(reinterpret_cast<char*>(&info), sizeof(UserInfo), encryptKey);

    outFile.write(reinterpret_cast<const char*>(&info), sizeof(UserInfo));
    outFile.close();
}

解密读取用户信息:

void loadEncryptedUsers() {
    std::ifstream inFile("users.enc", std::ios::binary);
    if (!inFile.is_open()) {
        std::cerr << "无法打开加密文件进行读取!" << std::endl;
        return;
    }

    UserInfo info;
    char encryptKey = 'K'; // 必须和加密时的密钥一致
    while (inFile.read(reinterpret_cast<char*>(&info), sizeof(UserInfo))) {
        // 解密数据
        xorCipher(reinterpret_cast<char*>(&info), sizeof(UserInfo), encryptKey);
        std::cout << "用户名:" << info.username << " | 密码:" << info.password << std::endl;
    }
    inFile.close();
}

3. 自定义专用后缀文件(比如:.usr、.account)

本质还是二进制存储,但改用自定义的后缀名(比如users.usr),会让普通用户误以为是某种专用软件格式,不会轻易尝试编辑。实现逻辑和自定义二进制文件完全一致,只是修改文件后缀即可,心理上能进一步降低用户编辑的意愿。

小提醒:

  • 用固定长度字符数组存储字符串,避免因字符串长度变化导致的序列化/反序列化错误;
  • 如果需要存储更多用户信息(比如注册时间、权限等级),直接扩展结构体即可;
  • 加密方案可以根据需求升级,比如用AES等更复杂的对称加密算法,但简单异或已经足够阻挡绝大多数普通用户了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:43:20