如何用C++将文本文件内容存入六个不同vector容器?
解决方法:将文本数据拆分存入多个vector容器
我来帮你搞定这个问题!要把文本文件里的结构化商品数据按指定顺序拆分到不同的vector容器中,核心思路是逐个读取对应类型的字段,然后分别添加到对应的容器里。这里需要注意的是商品名称可能包含空格,不能直接用普通的cin >>读取,得做特殊处理。
下面是完整的可运行代码,附带详细解释:
完整代码示例
#include <iostream> #include <fstream> #include <vector> #include <string> #include <sstream> #include <cctype> int main() { // 初始化你定义的各个容器 std::vector<int> iID; std::vector<std::string> iName; std::vector<int> pOrdered; std::vector<int> pInStore; std::vector<double> manufPrice; std::vector<double> sPrice; // 打开目标文本文件,替换成你的实际文件名 std::ifstream inputFile("products.txt"); if (!inputFile.is_open()) { std::cerr << "错误:无法打开文件!" << std::endl; return 1; } std::string line; // 逐行读取文件内容(不管文件是单行还是多行都适用) while (std::getline(inputFile, line)) { std::istringstream lineStream(line); int currentID; // 循环读取每个商品的ID(处理一行里的多个商品) while (lineStream >> currentID) { iID.push_back(currentID); // 读取商品名称:直到遇到下一个数字为止(支持带空格的名称) std::string productName; std::string tempStr; while (lineStream >> tempStr) { // 判断当前字符串是否为数字(仅检查整数,因为后续是int类型的pOrdered) bool isNumeric = true; for (char c : tempStr) { if (!std::isdigit(c)) { isNumeric = false; break; } } if (isNumeric) { // 将数字字符串放回流中,留给后续读取pOrdered用 lineStream.seekg(-static_cast<std::streamoff>(tempStr.size()), std::ios_base::cur); break; } // 拼接商品名称(处理多单词名称) productName += (productName.empty() ? "" : " ") + tempStr; } iName.push_back(productName); // 读取剩余的四个字段:pOrdered、pInStore、manufPrice、sPrice int ordered, inStore; double manuPrice, sellPrice; if (lineStream >> ordered >> inStore >> manuPrice >> sellPrice) { pOrdered.push_back(ordered); pInStore.push_back(inStore); manufPrice.push_back(manuPrice); sPrice.push_back(sellPrice); } else { // 数据格式错误时,回滚已存入的ID和名称,避免容器数据不一致 std::cerr << "警告:ID为" << currentID << "的商品数据格式错误,已跳过!" << std::endl; iID.pop_back(); iName.pop_back(); } } } // 关闭文件 inputFile.close(); // 验证数据是否正确存入(可选,用于测试) std::cout << "已成功存入的数据:\n"; for (size_t i = 0; i < iID.size(); ++i) { std::cout << "商品ID:" << iID[i] << " | 名称:" << iName[i] << " | 已订购量:" << pOrdered[i] << " | 库存量:" << pInStore[i] << " | 出厂价:" << manufPrice[i] << " | 售价:" << sPrice[i] << "\n"; } return 0; }
关键细节解释
文件读取与错误检查:
- 使用
std::ifstream打开文件后,必须检查is_open()的返回值,避免文件不存在或权限不足时导致后续操作崩溃。 - 用
std::getline逐行读取文件,再通过std::istringstream将每行内容转换为可读取的流,方便拆分字段。
- 使用
带空格的商品名称读取:
- 读取完商品ID后,通过循环读取字符串并判断是否为数字,来确定商品名称的结束位置,这样不管名称是1个还是多个单词都能正确捕获。
- 当遇到数字字符串时,通过
seekg将流的指针移回,让后续代码可以读取这个数字作为pOrdered的值。
字段读取与错误处理:
- 剩余的四个字段都是数值类型,直接用
>>运算符读取即可,它会自动跳过空格和换行符。 - 如果某条商品的字段不完整(比如少了某个数值),代码会回滚已存入的ID和名称,保证所有容器的元素数量一致。
- 剩余的四个字段都是数值类型,直接用
注意事项
- 请将代码中的
products.txt替换为你实际的文本文件名,如果文件不在程序运行目录,需要填写完整路径(比如C:/data/products.txt)。 - 确保文本文件的数据严格遵循你指定的顺序:
iID(整数)→iName(可含空格的字符串)→pOrdered(整数)→pInStore(整数)→manufPrice(小数)→sPrice(小数)。
内容的提问来源于stack exchange,提问作者NetElvis
相关产品推荐
相关产品推荐

