将以逗号分隔的txt文件读入数组C++ cpp

wmomyfyw  于 2022-11-19  发布在  其他
关注(0)|答案(2)|浏览(165)

C++问题!我有一个包含以下信息的.txt文件:

james, watson
brittany,blake
roger,tra4@pos
jonathan, pote5
amber,Trisa123!

其中第一列是名称,第二列是网站用户的ID。
我需要读取此文件,然后将信息存储到2个数组中:name[] user_Id []你能帮我吗?我找到了将其保存到2D向量中的解决方案,但我更喜欢将其保存为数组,因为我需要将字符串值与另一个字符串进行比较(由uer接收,以检查她的名称/用户ID是否已在系统中)
我找到了将其保存到二维向量中的解决方案,但不适用于数组。

mf98qq94

mf98qq941#

我将向您展示您所要求的解决方案,但我很抱歉地通知您,解决方案的方法是错误的。原因有很多。首先,也是最重要的:在C++中,通常应该而不是不使用C-Style数组。
C-Style数组的大小是固定的,并且不是动态的。所以,你总是会得到一个 * 估计 * 最大大小的幻数。正确的方法是使用动态容器。对于你的解决方案,std::vector是最合适的。
然后,为相关数据分离数组是一个非常糟糕的主意。正确的方法是将相关数据放在一个struct中,然后创建该结构体的一个std::vector。否则,您将不得不始终维护和处理两个数组,甚至可能失去相关数据之间的同步。
无论如何,我将首先向您展示一个解决方案以下你的想法:

#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
using namespace std;

const unsigned int MagicNumberForMaxArraySize = 42;

int main() {

    // Define Arrays to hold the user and their IDs
    string user[MagicNumberForMaxArraySize]{};
    string user_ID[MagicNumberForMaxArraySize]{};

    // Open the file and check, if it could be opened
    ifstream ifs("test.txt");
    if (ifs.is_open()) {

        unsigned int index = 0;
        // Read all lines and put result into arrays
        while ((index < MagicNumberForMaxArraySize) and 
            (getline(getline(ifs, user[index], ',') >> ws, user_ID[index]))) {
            // Now we have read a comlete line. Goto next index
            ++index;
        }
        // Show debug output
        for (unsigned int i = 0; i < index; ++i)
            cout << "User: " << user[i] << "\tID: " << user_ID[i] << '\n';
    }
    else
        cout << "\n\n*** Error: Could not open source file\n\n";
}

但是我不建议继续这样做。下一个改进是使用一个struct,然后是一个struct数组。另外,我将去掉永远不应该使用的using namespace std;。并且,我用通用初始化器初始化变量。

#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>

const unsigned int MagicNumberForMaxArraySize = 42;

struct Data {
    std::string user{};
    std::string ID{};
};

int main() {

    // Define array for our needed data
    Data data[MagicNumberForMaxArraySize];

    // Open the file and check, if it could be opened
    std::ifstream ifs("test.txt");
    if (ifs.is_open()) {

        unsigned int index = 0;
        // Read all lines and put result into arrays
        while ((index < MagicNumberForMaxArraySize) and 
            (std::getline(std::getline(ifs, data[index].user, ',') >> std::ws, data[index].ID))) {
            // Now we have read a comlete line. Goto next index
            ++index;
        }
        // Show debug output
        for (unsigned int i = 0; i < index; ++i)
            std::cout << "User: " << data[i].user << "\tID: " << data[i].ID<< '\n';
    }
    else
        std::cout << "\n\n*** Error: Could not open source file\n\n";
}

发展历程:
现在我们将介绍一个面向对象的原理。数据和对该数据进行操作的方法将位于一个classstruct中。因此,我们将在struct中添加IO方法,并添加一个额外的struct以容纳所有用户。此外,可以使用新的带有初始化器的if-语句。当然还有std::vector
请参阅:

#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
#include <vector>

// Struct to hold properties for one user
struct User {
    std::string name{};
    std::string ID{};

    // Simple extraction
    friend std::istream& operator >> (std::istream& is, User& user) {
        std::getline(std::getline(is, user.name, ',') >> std::ws, user.ID);
        return is;
    }
    // Simple inserter
    friend std::ostream& operator << (std::ostream& os, const User& user) {
        return os << "User: " << user.name << "\tID: " << user.ID;
    }
};
// This class will contain all users
struct Data {
    std::vector<User> users{};
    // Simple extraction
    friend std::istream& operator >> (std::istream& is, Data& d) {
        // Delete potential existing old data
        d.users.clear();
        // Now read all users
        for (User temp{}; is >> temp; d.users.push_back(std::move(temp)));
        return is;
    }
    // Simple inserter
    friend std::ostream& operator << (std::ostream& os, const Data& d) {
        for (const User& u : d.users) os << u << '\n';
        return os;
    }
};

int main() {
    // Open the file and check, if it could be opened
    if (std::ifstream ifs("test.txt");ifs) {

        // Read all data and show result
        if (Data data{}; not (ifs >> data).bad())
            std::cout << data;
    }
    else
        std::cout << "\n\n*** Error: Could not open source file\n\n";
}
rhfm7lfc

rhfm7lfc2#

您也可以使用cstring库中的strtok()将字符串拆分为标记:Split string in C/C++

相关问题