利用 stringstream 和 getline 实现仅通过一次键盘录入初始化整个数组

本文介绍了一种使用C++标准库中的stringstream类高效地从键盘输入数组的方法。通过结合getline函数,可以一次性读取带有空格分隔的多个元素,并将其逐个存入数组中。

我们有时候需要从键盘输入一个数组,如果一次输入一个元素将十分的麻烦,因此我们考虑一次性输入整个数组,每个元素之间用空格分隔,然后再在程序内将每个元素分开,存到数组当中。我们可以利用 stringstream 和 getline 来实现。

标准库定义了三种类型的字符串流:

istringstream//提供读string的功能
ostringstream//提供写string功能
stringstream//提供读写string功能,一般用 stringstream 就行了

stringstream 的常用操作:

stringstream seq;//创建 stringstream 对象
stringstream seq(s);//用 string 对象s的内容来创建一个 strigstream 对象
seq.str();//返回 seq 中存储的 string 对象
seq.str(s);//将 string 对象复制给 seq,返回 void

具体的代码如下

#include<sstream>
//使用 stringstream 类必须要包含该头函数

string input;
stringstream _input;
getline(cin, input);//读取含空格字符串
_input.str(input);//用字符串 input 初始化 stringstream 对象 _input

for(int i = 0; i < numofObject; i++)//numofObject 为元素的个数
{
    _input >> object[i];//把每一个元素存到数组当中
}
好的,下面是一个完整的C++实现,包括学生信息的结构体定义、学生信息管理类的实现、异常处理、数据存储等功能。 首先,我们定义一个学生信息的结构体,包括学生姓名、学号、班级、课程名称、成绩等信息。 ```c++ struct Student { string name; string id; string className; string courseName; float score; }; ``` 接下来,我们定义一个学生信息管理类,该类实现对学生信息的录入、增加、删除、查询等功能。为了方便数据存储,我们使用了文件存储。 ```c++ class StudentManager { private: vector<Student> students; // 存储所有学生信息的容器 string filename; // 数据存储的文件名 public: // 构造函数,初始化数据存储文件名 StudentManager(const string& filename); // 添加学生信息 void addStudent(const Student& student); // 删除学生信息 void deleteStudent(const string& id); // 修改学生信息 void updateStudent(const string& id, const Student& student); // 查询学生信息 Student getStudent(const string& id); // 获取所有学生信息 vector<Student> getAllStudents(); // 获取某个班级的所有学生信息 vector<Student> getStudentsByClass(const string& className); // 获取某个课程的所有学生信息 vector<Student> getStudentsByCourse(const string& courseName); // 从文件中读取学生信息 void loadFromFile(); // 将学生信息写入文件 void saveToFile(); }; ``` 在实现上述方法时,我们需要使用文件读写操作,这里使用C++标准库中的fstream类实现。我们需要在构造函数中初始化数据存储的文件名,并在析构函数中保存数据到文件。 ```c++ StudentManager::StudentManager(const string& filename) { this->filename = filename; // 从文件中读取学生信息 loadFromFile(); } void StudentManager::saveToFile() { ofstream outfile(filename); if(!outfile.is_open()) { throw runtime_error("数据文件打开失败!"); } for(auto& student : students) { outfile << student.name << "," << student.id << "," << student.className << "," << student.courseName << "," << student.score << endl; } outfile.close(); } void StudentManager::loadFromFile() { ifstream infile(filename); if(!infile.is_open()) { throw runtime_error("数据文件打开失败!"); } students.clear(); string line; while(getline(infile, line)) { stringstream ss(line); string name, id, className, courseName; float score; getline(ss, name, ','); getline(ss, id, ','); getline(ss, className, ','); getline(ss, courseName, ','); ss >> score; students.push_back({name, id, className, courseName, score}); } infile.close(); } ``` 接下来,我们可以实现添加学生信息的方法: ```c++ void StudentManager::addStudent(const Student& student) { // 将学生信息存储到容器中 students.push_back(student); // 将学生信息写入文件 saveToFile(); } ``` 删除学生信息的方法可以这样实现: ```c++ void StudentManager::deleteStudent(const string& id) { // 遍历容器,找到指定学号的学生信息并删除 for (auto it = students.begin(); it != students.end(); it++) { if (it->id == id) { students.erase(it); // 将学生信息写入文件 saveToFile(); return; } } throw runtime_error("未找到指定学号的学生信息!"); } ``` 查询学生信息的方法可以这样实现: ```c++ Student StudentManager::getStudent(const string& id) { // 遍历容器,找到指定学号的学生信息并返回 for (const auto& student : students) { if (student.id == id) { return student; } } // 如果没有找到,抛出异常 throw runtime_error("未找到指定学号的学生信息!"); } ``` 修改学生信息的方法可以这样实现: ```c++ void StudentManager::updateStudent(const string& id, const Student& student) { // 遍历容器,找到指定学号的学生信息并修改 for (auto& s : students) { if (s.id == id) { s = student; // 将学生信息写入文件 saveToFile(); return; } } throw runtime_error("未找到指定学号的学生信息!"); } ``` 获取所有学生信息的方法可以这样实现: ```c++ vector<Student> StudentManager::getAllStudents() { return students; } ``` 获取某个班级的所有学生信息的方法可以这样实现: ```c++ vector<Student> StudentManager::getStudentsByClass(const string& className) { vector<Student> result; for (const auto& student : students) { if (student.className == className) { result.push_back(student); } } return result; } ``` 获取某个课程的所有学生信息的方法可以这样实现: ```c++ vector<Student> StudentManager::getStudentsByCourse(const string& courseName) { vector<Student> result; for (const auto& student : students) { if (student.courseName == courseName) { result.push_back(student); } } return result; } ``` 最后,我们可以在main函数中使用学生信息管理类来实现对学生信息的录入、增加、删除、查询等功能。 ```c++ int main() { try { StudentManager manager("data.txt"); manager.addStudent({"张三", "1001", "班级1", "语文", 80}); manager.addStudent({"李四", "1002", "班级2", "数学", 90}); manager.addStudent({"王五", "1003", "班级1", "英语", 85}); auto allStudents = manager.getAllStudents(); for (const auto& student : allStudents) { cout << student.name << " " << student.id << " " << student.className << " " << student.courseName << " " << student.score << endl; } auto class1Students = manager.getStudentsByClass("班级1"); for (const auto& student : class1Students) { cout << student.name << " " << student.id << " " << student.className << " " << student.courseName << " " << student.score << endl; } auto englishStudents = manager.getStudentsByCourse("英语"); for (const auto& student : englishStudents) { cout << student.name << " " << student.id << " " << student.className << " " << student.courseName << " " << student.score << endl; } manager.deleteStudent("1002"); auto student = manager.getStudent("1001"); student.score = 85; manager.updateStudent("1001", student); allStudents = manager.getAllStudents(); for (const auto& student : allStudents) { cout << student.name << " " << student.id << " " << student.className << " " << student.courseName << " " << student.score << endl; } } catch (const exception& e) { cerr << e.what() << endl; } return 0; } ``` 这样,我们就实现了一个小型学生信息管理系统,具备对成绩的录入、增加、删除、查询等功能,并且可以实现数据的持久化存储。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值