#include "ConfigFiles.h" #include #include #include #include ConfigFiles::ConfigFiles(QObject *parent) : QObject(parent) { } tsServerAddr ConfigFiles::ReadServerAddr(){ tsServerAddr SAddr; // 检查文件是否存在 QFileInfo checkFile("./ProgramConfig/IPAddrConfig.ini"); // 创建QSettings对象,指定INI文件路径 QSettings File("./ProgramConfig/IPAddrConfig.ini", QSettings::IniFormat); if (checkFile.exists() && checkFile.isFile()) { // 如果文件已经存在 SAddr.Host = File.value("PLC_Server/Host").toString(); SAddr.UserName = File.value("PLC_Server/UserName").toString(); SAddr.Passwd = File.value("PLC_Server/Password").toString(); qInfo()<<"读取到的PLC 地址配置:"< 每个 QStringList 为一行的字段 */ QList ConfigFiles::ReadFile_Csv(const QString &filePath){ QList rows; QFile file(filePath); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { qWarning() << "CSV 打开失败:" << file.errorString(); return rows; } QTextStream in(&file); #if defined(Q_OS_LINUX) // 判断操作系统是否为Linux in.setCodec("GBK"); // 如有需要可改成 "GBK" #elif defined(Q_OS_WIN) // 判断操作系统是否为Windows #else // 如果不是Linux也不是Windows #endif QStringList currentRow; QString currentField; bool inQuote = false; while (!in.atEnd()) { QString line = in.readLine(); // 处理跨行引号:如果上一行未闭合,继续拼 if (inQuote) currentField += "\n"; else currentField.clear(); for (int i = 0; i < line.size(); ++i) { QChar ch = line.at(i); if (ch == '\"') { // 连续两个引号表示转义 if (i + 1 < line.size() && line.at(i + 1) == '\"') { currentField += '\"'; ++i; // 跳过下一个引号 } else { inQuote = !inQuote; } } else if (ch == ',' && !inQuote) { // 字段结束 currentRow << currentField.trimmed(); currentField.clear(); } else { currentField += ch; } } // 如果引号已闭合,把最后一列也加入并结束本行 if (!inQuote) { currentRow << currentField.trimmed(); rows << currentRow; currentRow.clear(); } } // 如果文件结尾时引号未闭合,把剩余部分作为最后一列 if (!currentField.isEmpty() || !currentRow.isEmpty()) { currentRow << currentField.trimmed(); rows << currentRow; } file.close(); return rows; }