读取以逗号分隔的txt文件到数组c++ cpp



c++问题!

我有一个。txt文件,其中包含以下信息:

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

,其中第一列是姓名,第二列是网站用户的Id。

我需要读取这个文件,然后将信息存储到两个数组中:

name[]
user_Id []

你能帮帮我吗?我找到了将其保存为2d矢量的解决方案,但我更喜欢将其保存为数组,因为我需要将字符串值与另一个字符串(由用户接收以检查她的名称/用户Id是否已经在系统中)进行比较

我找到了将其保存为2d矢量但不用于数组的解决方案。

我会向您展示您要求的解决方案,但我很抱歉地通知您,解决方案的方法是错误的。出于各种原因。首先,也是最重要的:在c++中,C风格的数组通常应该而不是

c风格数组的大小是固定的,不是动态的。所以,你总是会想出一个神奇的数字估计最大大小。正确的方法是使用动态容器。对于您的解决方案,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 << "nn*** Error: Could not open source filenn";
}

但我不建议继续这样做。下一个改进是使用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 << "nn*** Error: Could not open source filenn";
}

进化:

现在我们将介绍一个面向对象的原则。在此数据上操作的数据和方法应在一个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 << "nn*** Error: Could not open source filenn";
}

您也可以使用cstring库中的strtok()将字符串拆分为令牌:

相关内容

  • 没有找到相关文章