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";
}
进化:
现在我们将介绍一个面向对象的原则。在此数据上操作的数据和方法应在一个class
或struct
中。因此,我们将向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()
将字符串拆分为令牌: