读/写数据然后分开数据

时间:2011-03-10 17:28:03

标签: c++

我是C ++的新手。我正在做一个C ++注册表单,我将所有用户数据保存在一个名为user.txt的文本文件中,格式为

name|password|address|postal|phone

每个用户记录占用一行。

所以我的第一个问题是如何在C ++中很好地完成这项工作

至于阅读部分,我的主要问题是如何通过拆分“|”来分隔数据然后将记录放在用户数组中。因此,当我执行登录功能时,我可以遍历数组以匹配用户。

我目前的阅读代码是

string User::readUser(){
    ifstream fin("user.txt");
    string line;
    while(getline(line,fin)){
        string name, password, address; int postal, phone;//put the records into a 2 dimention array
    }
    //return array
}

3 个答案:

答案 0 :(得分:1)

查看this answer

在您的情况下,字段将按顺序附加到vector<string>,因此您可以直接从中访问它们。第一个位置对应于名称,第二个位置对应于密码等等。

以下是一个例子:

// The elements should be in this order: name, password, address, postal, phone
vector<string> v = split(line, '|');
string name = v[0], password = v[1], address = v[2];

关于第二个问题,您可以创建描述用户的结构或类:

struct User {

    // Using type string for all fields for convenience.
    string name, password, address, postal, phone;

    User(string n, string pw, string a, string p, string ph): name(n),
                                                              password(pw),
                                                              address(a),
                                                              postal(p),
                                                              phone(ph) {}

};

vector<User> uv;

// ...

// Split string, create user instance and append it to the user list
vector<string> v = split(line, '|');
uv.push_back(User(v[0], v[1], v[2], v[3], v[4]));

迭代User向量:

for (int i = 0; i < uv.size(); ++i) {
    if (uv[i].name == "John") {
        // Process John...
    }
}

答案 1 :(得分:1)

前段时间我用C++ sscanf replacement写了一个答案。它非常适合您的情况:

std::vector<boost::any> user_data;
sscanf(line, "%s|%s|%s|%i|%i", user_data);

现在构建一个User(Matheus Moreira的answer中的结构)非常简单:

User(boost::any_cast<std::string>(user_data[0]), // name
     boost::any_cast<std::string>(user_data[1]), // password
     boost::any_cast<std::string>(user_data[2]), // address
     boost::any_cast<int>(user_data[3]),  // postal
     boost::any_cast<int>(user_data[4])); // phone

这需要boostanylexical_cast

答案 2 :(得分:0)

显而易见的解决方案是在每一行使用boost :: regex:这个 将进行输入格式检查以及分离字段。 类似的东西:

while ( getline( line, fin ) ) {
    static boost::regex const pattern(
        "\\([^|]+\\)\\|\\([^|]+\\)|\\([^|]+\\)|\\([^|]+\\)|\\([^|]+\\)" );
    boost::smatch match;
    if ( !regex_match( line, match, pattern ) ) {
        //  Error handling...
    } else {
        // match[1] is name, match[2] is password, etc.
    }
}

更复杂的匹配模式是可能的,例如需要邮政和 手机是数字的。您也可以轻松修改它以允许领先 并且尾随空白区域。