ULONGLONG类型转换为double型提示出错的解决方法(error C2520)

本文介绍了一个在VC++6.0环境下遇到的数据类型转换错误,并给出了具体的解决方案。错误出现在将无符号长整型(__int64)转换为双精度浮点数(double)时,解决方法是修改变量定义并进行适当的类型转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

平台VC++ 6.0double pos;

ULONGLONG  n,filesize;

pos=n/filesize;

错误提示:

error   C2520:   conversion   from   unsigned   __int64   to   double   not   implemented,   use   signed   __int64 

 

解决方法:

由于我不需要使用无符号LONGLONG,所以把变量定义如下:

 

double pos;

LONGLONG  n,filesize;

语句改为:

pos=n*1.0/filesize;

编译通过

 

 

/** * @file ExportTool.h * @brief 导出文件 * @author 作者名 * @date 创建日期 * @copyright 版权信息 */ #ifndef EXPORTTOOL_H #define EXPORTTOOL_H #include <qstring.h> #include <qjsonarray.h> enum FileType{ FT_None = 0, FT_Csv, FT_Xlsx, FT_Docx }; class ImportOptions{ public: ImportOptions() :fileType(FT_Xlsx) ,saveToDb(true) ,batchSize(1000) {} //canshu FileType fileType; bool saveToDb; int batchSize; QString tableName; }; /** * @brief The ExportTool class 导出文件 */ class ExportTool { ExportTool(); public: ~ExportTool(); /** * @brief instance 单例 * @return */ static ExportTool *instance(); /** * @brief exportFile 导出文件 * @param fn 文件名称 * @param records 数据库数据 * @param ft 文件类 * @return */ //bool exportFile(const QString& fn, const QJsonArray& records, FileType ft = FT_Csv); bool exportFile(const QString& fn, const QJsonArray& records, FileType ft = FT_Xlsx); bool importFile(const QString&fn, QJsonArray& records,const ImportOptions& option); private: // static ExportTool* m_instance; }; #endif // EXPORTTOOL_H #include "ExportTool.h" #include "QXlsx/header/xlsxdocument.h" #include<QDebug> #include<QJsonObject> #include <QFile> #include <QCoreApplication> #include <QDir> #include <QJsonArray> #include "common/DataBaseManager.h" #include "user/UserManager.h" #include <QXlsx/header/xlsxcell.h> #include <QtWidgets/QFileDialog> ExportTool::ExportTool() { } ExportTool *ExportTool::m_instance = 0; ExportTool *ExportTool::instance() { if(m_instance == 0) m_instance = new ExportTool; return m_instance; } bool ExportTool::exportFile(const QString &fn, const QJsonArray &records, FileType ft) { if(ft !=FT_Xlsx) { qDebug()<<"仅支持导出位XLsx文件"; } if(records.isEmpty()) { qDebug()<<"导出失败,没有数据"; return false; } QString filePath = fn; // 如果未传入路径,使用默认路径+自动命名 if (filePath.isEmpty()) { QString defaultDir = QCoreApplication::applicationDirPath() + "/export"; QDir dir(defaultDir); if (!dir.exists()) { dir.mkpath("."); // 创建目录包括父目录 } // 2. 自动生成文件名 QString fileName = QString("数据导出_%1.xlsx") .arg(QDateTime::currentDateTime().toString("yyyyMMddHHmmss")); // 拼接完整路径 filePath = dir.filePath(fileName); qDebug() << "未指定路径,自动保存至:" << filePath; } //创建文档 QXlsx::Document xlsx; //获取表头2 QJsonObject firstObj = records.first().toObject(); QStringList headers = firstObj.keys(); for(int col =0;col<headers.size();++col) { xlsx.write(1, col + 1, headers[col]); } //写入数据--从第二行写入 for (int row = 0; row < records.size(); ++row) { QJsonObject obj = records[row].toObject(); // 遍历当前行的所有字段,写入对应列 for (int col = 0; col < headers.size(); ++col) { QString key = headers[col]; // 字段名(与表头对应) QJsonValue value = obj.value(key); // 字段值 // 将 QJsonValue 转换为 QVariant QVariant cellValue; if (value.isString()) { cellValue = value.toString(); } else if (value.isDouble()) { cellValue = value.toDouble(); } else if (value.isBool()) { cellValue = value.toBool(); } else if (value.isNull()) { cellValue = ""; // 空值显示为空字符串 } else { cellValue = "不支持的类"; } // 写入单元格 xlsx.write(row + 2, col + 1, cellValue); } } // 导出文件 bool saveSuccess = xlsx.saveAs(fn); if (saveSuccess) { qDebug() << "XLSX 导出成功:" << fn; } else { qDebug() << "XLSX 导出失败:" << fn; } return saveSuccess; } bool ExportTool::importFile(const QString& filePath, QJsonArray& records, const ImportOptions& options) { // 1. 参数校验 if (options.saveToDb && options.tableName.isEmpty()) { qDebug() << "保存数据库失败:未指定目标表名"; return false; } if (options.fileType != FT_Xlsx) { qDebug() << "仅支持导入XLSX文件"; return false; } // 2. 清空输出容器 records = QJsonArray(); // 3. 检查文件存在性 if (!QFile::exists(filePath)) { qDebug() << "文件不存在:" << filePath; return false; } // 4. 读取XLSX文件 QXlsx::Document xlsx(filePath); QXlsx::Worksheet *sheet = xlsx.currentWorksheet(); if (!sheet) { qDebug() << "无法获取工作表,文件可能损坏"; return false; } // 读取表头 QStringList headers; int col = 0; while (true) { std::shared_ptr<QXlsx::Cell> cell = sheet->cellAt(1, col); if (!cell || cell->value().isNull()) break; headers << cell->value().toString(); col++; } qDebug() << "读取到的表头:" << headers; if (headers.isEmpty()) { qDebug() << "文件没有有效的表头数据"; return false; } // 读取数据行 int row = 2; while (true) { std::shared_ptr<QXlsx::Cell> firstCell = sheet->cellAt(row, 1); if (!firstCell || firstCell->value().isNull()) break; QJsonObject recordObj; for (int c = 0; c < headers.size(); c++) { std::shared_ptr<QXlsx::Cell> cell = sheet->cellAt(row, c + 1); if (cell) { QVariant value = cell->value(); // 类型转换 if (value.type() == QVariant::String) { recordObj[headers[c]] = value.toString(); } else if (value.type() == QVariant::Int || value.type() == QVariant::Double) { recordObj[headers[c]] = value.toDouble(); } else if (value.type() == QVariant::Bool) { recordObj[headers[c]] = value.toBool(); } else { recordObj[headers[c]] = value.toString(); } } else { recordObj[headers[c]] = QJsonValue::Null; } } records.append(recordObj); row++; } qDebug() << "XLSX导入完成,共" << records.size() << "条记录"; // 5. 保存到数据库(使用options中的配置) if (options.saveToDb && !records.isEmpty()) { DataBaseManager *dbMgr = DataBaseManager::instance(); if (!dbMgr->connect()) { qDebug() << "数据库连接失败:" << dbMgr->getLastError(); return false; } if (!dbMgr->existTable(options.tableName)) { qDebug() << "目标表不存在:" << options.tableName; dbMgr->close(); return false; } // 事务处理(使用options.batchSize作为批次大小) if (!dbMgr->exec("BEGIN TRANSACTION;")) { qDebug() << "开启事务失败:" << dbMgr->getLastError(); dbMgr->close(); return false; } int total = records.size(); bool transactionSuccess = true; for (int i = 0; i < total; i++) { QJsonObject obj = records[i].toObject(); QVariantMap dataMap; for (auto it = obj.begin(); it != obj.end(); ++it) { dataMap[it.key()] = it->toVariant(); } if (!dbMgr->insertRecord(options.tableName, dataMap)) { qDebug() << "第" << (i + 1) << "条记录插入失败"; transactionSuccess = false; break; } // 批次提交 if ((i + 1) % options.batchSize == 0) { if (!dbMgr->exec("COMMIT;") || !dbMgr->exec("BEGIN TRANSACTION;")) { qDebug() << "批次提交失败"; transactionSuccess = false; break; } } } // 处理最后一批 if (transactionSuccess) { transactionSuccess = dbMgr->exec("COMMIT;"); } else { dbMgr->exec("ROLLBACK;"); } dbMgr->close(); return transactionSuccess; } return true; } 这是我实现文件的导入和导出的功能,导出功能已经实现,导入函数有点问题,请帮我实现文件的导入功能
最新发布
08-05
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值