You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C++文件IO读写对象变量:图书馆系统数据解析优化需求

高效处理CSV格式书籍数据的解决方案

首先,我注意到你当前的代码有个明显的小问题:你的示例数据格式是"书名,作者,价格,",但代码里的switch分支把case 1对应到了tempPricecase 2对应到tempAuthor,这会导致作者和价格的内容完全搞反,这是首先要修正的点。

接下来针对你提到的getline高效分割逗号分隔字符串的需求,这里有几个更简洁可靠的方案,比手动遍历字符的方式更易维护:

方案一:利用stringstream配合getline指定分隔符

这是C++处理CSV分割场景最常用的方法,完全适配getline的使用逻辑,不需要手动计数和判断字符:

#include <sstream> // 必须包含这个头文件

// 替换你while(getline(myfileL, line))循环内的分割逻辑:
tempName = tempAuthor = tempPrice = "";
stringstream ss(line);
// 用getline指定逗号作为字段分隔符,依次读取每个字段
getline(ss, tempName, ',');
getline(ss, tempAuthor, ',');
getline(ss, tempPrice, ',');
// 注:你的每行末尾有个额外逗号,最后一次getline会得到空字符串,直接忽略即可

这个方案的优势:

  • 代码简洁直观,逻辑清晰
  • 自动适配任意长度的字段内容,不需要担心字符遍历的边界问题
  • 和你原本使用getline读取行的逻辑完全统一

方案二:封装通用字符串分割函数

如果你的项目里需要多次处理类似的字符串分割场景,可以封装一个可复用的工具函数,把字符串按指定分隔符分割成字符串数组:

#include <vector>
#include <string>
#include <sstream>

// 通用分割函数:按指定分隔符分割字符串,过滤空字段
vector<string> split(const string &s, char delim) {
    vector<string> tokens;
    string token;
    stringstream ss(s);
    while (getline(ss, token, delim)) {
        if (!token.empty()) {
            tokens.push_back(token);
        }
    }
    return tokens;
}

// 在你的文件读取循环中使用:
vector<string> parts = split(line, ',');
if (parts.size() >= 3) { // 确保读取到足够的字段
    tempName = parts[0];
    tempAuthor = parts[1];
    tempPrice = parts[2];
}

这个函数可以复用在任何需要分割字符串的场景,灵活性更高。

如果你想保留原有遍历逻辑的修正方案

如果暂时不想替换现有逻辑,至少要修正switch分支的顺序,匹配你的数据格式:

switch (nbArg){
    case 0: tempName += line.at(j); break;
    case 1: tempAuthor += line.at(j); break; // 对应第二个字段:作者
    case 2: tempPrice += line.at(j); break; // 对应第三个字段:价格
}

另外,要注意行尾的逗号会让nbArg增加到3,你可以在循环结束后判断nbArg的数值,避免处理无效的空字段。

额外优化建议

  • 把价格字符串转换成double类型存储在Book类中,而不是一直用字符串,这样后续做价格排序、计算等操作会更方便:double price = stod(tempPrice);
  • 读取文件时最好增加字段有效性检查,比如判断价格是否能正常转换成数字,避免无效数据导致程序出错

内容的提问来源于stack exchange,提问作者محمد خير الخلق

火山引擎 最新活动