You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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;
}

关键细节解释

  1. 文件读取与错误检查:

    • 使用std::ifstream打开文件后,必须检查is_open()的返回值,避免文件不存在或权限不足时导致后续操作崩溃。
    • 用std::getline逐行读取文件,再通过std::istringstream将每行内容转换为可读取的流,方便拆分字段。
  2. 带空格的商品名称读取:

    • 读取完商品ID后,通过循环读取字符串并判断是否为数字,来确定商品名称的结束位置,这样不管名称是1个还是多个单词都能正确捕获。
    • 当遇到数字字符串时,通过seekg将流的指针移回,让后续代码可以读取这个数字作为pOrdered的值。
  3. 字段读取与错误处理:

    • 剩余的四个字段都是数值类型,直接用>>运算符读取即可,它会自动跳过空格和换行符。
    • 如果某条商品的字段不完整(比如少了某个数值),代码会回滚已存入的ID和名称,保证所有容器的元素数量一致。

注意事项

  • 请将代码中的products.txt替换为你实际的文本文件名,如果文件不在程序运行目录,需要填写完整路径(比如C:/data/products.txt)。
  • 确保文本文件的数据严格遵循你指定的顺序:iID(整数)→ iName(可含空格的字符串)→ pOrdered(整数)→ pInStore(整数)→ manufPrice(小数)→ sPrice(小数)。

内容的提问来源于stack exchange,提问作者NetElvis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:41:47