C++实现查找.cav文件并将结果生成为.xml文件

目录

例题描述

需求实现

例题描述

例题来自鹤壁海昌智能面试题。

有一个.cav文件,文件内容如下图:

该文件内容共有1024行*2列的int型数据。

现有如下需求:

1.寻找name.csv里第二列小于等于40000的最大数
输出格式:endy <Third1 endx="0" endy="40000" /> 
2.寻找最接近39500的数的对应的行第一个数end50y 
输出格式:<Third1 end50x="50" end50y="32143" /> 
3.寻找最接近39500的数Defaulty
输出格式:<Third1 Defaultx="150" Defaulty="39499" /> 
4.寻找最接近寻找最接近39000的数 
输出格式:<Third1 end100x="100" endy="39001" />
5.生成cc.xml并写入。

需求实现

1.主要思路和设计过程

(1)结构体设计

        定义一个结构体 Row 表示CSV文件的一行数据,包含两个整数。这样有助于更好地组织和处理数据。

struct Row {int col1;int col2;};

(2)CSV文件读取

        使用 readCSV 函数读取CSV文件,将每一行的两个整数保存到结构体 Row 中,并将所有行数据保存在一个 vector 中。

vector<Row> readCSV(const string& filename) {// 读取CSV文件并返回包含行数据的向量// ...}

(3)寻找第二列小于等于40000的最大值

        使用 findMaxBelowThreshold 函数遍历所有行数据,找到第二列小于等于40000的最大值。

Row findMaxBelowThreshold(const vector<Row>& rows, int threshold) {// 寻找第二列小于等于给定阈值的最大值// ...}

(4)寻找最接近39500的数

        使用 findClosestToValue 函数遍历所有行数据,找到最接近39500的数。

Row findClosestToValue(const vector<Row>& rows, int value) {// 寻找最接近给定值的行// ...}

(5)生成xml标签

        使用 writeXML 函数根据找到的结果生成XML标签。

void writeXML(const string& filename, const Row& result) {// 写XML文件,表示结果行数据// ...}

2.程序实现

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

/*
1.寻找name.csv里第二列小于等于40000的最大数
endy <Third1 endx="0" endy="40000" /> 
2.寻找最接近39500的数的对应的行第一个数end50y 
<Third1 end50x="50" end50y="32143" /> 
3.寻找最接近39500的数Defaulty
<Third1 Defaultx="150" Defaulty="39499" /> 
4.寻找最接近寻找最接近39000的数 
<Third1 end100x="100" endy="39001" />
5.生成cc.xml并写入。*/

struct Data {
    int col1;
    int col2;
};

vector<Data> readCSV(string filename) {
    vector<Data> data;
    ifstream file(filename);
    if (file.is_open()) {
        string line;
        while (getline(file, line)) {
            Data d;
            sscanf_s(line.c_str(), "%d,%d", &d.col1, &d.col2);
            data.push_back(d);
        }  
        file.close();
    }
    else
        cerr << "无法打开文件: " << filename << endl;

    return data;
}

int findMax(vector<Data> data) {
    int max = -1;
    for (int i = 0; i < data.size(); i++) {
        if (data[i].col2 <= 40000 && data[i].col2 > max) {
            max = data[i].col2;
        }
    }
    return max;
}

int findClosest50(vector<Data> data) {
    int closest = -1;
    int minDiff = INT_MAX;
    for (int i = 0; i < data.size(); i++) {
        int diff = abs(data[i].col2 - 39500);
        if (diff < minDiff) {
            closest = data[i].col1;
            minDiff = diff;
        }
    }
    return closest;
}

int findClosestDefault(vector<Data> data) {
    int closest = -1;
    int minDiff = INT_MAX;
    for (int i = 0; i < data.size(); i++) {
        int diff = abs(data[i].col2 - 39500);
        if (diff < minDiff) {
            closest = data[i].col2;
            minDiff = diff;
        }
    }
    return closest;
}

int findClosest100(vector<Data> data) {
    int closest = -1;
    int minDiff = INT_MAX;
    for (int i = 0; i < data.size(); i++) {
        int diff = abs(data[i].col2 - 39000);
        if (diff < minDiff) {
            closest = data[i].col2;
            minDiff = diff;
        }
    }
    return closest;
}

void writeXML(int max, int closest50, int closestDefault, int closest100) {
    ofstream file("cc.xml");
    if (file.is_open()) {
        file << "<Results>" << endl;
        file << "    <Result1 endx=\"0\" endy=\"" << max << "\" />" << endl;
        file << "    <Result2 end50x=\"50\" end50y=\"" << closest50 << "\" />" << endl;
        file << "    <Result3 Defaultx=\"150\" Defaulty=\"" << closestDefault << "\" />" << endl;
        file << "    <Result4 end100x=\"100\" endy=\"" << closest100 << "\" />" << endl;
        file << "</Results>" << endl;

        file.close();
        cout<<"写入成功"<<endl;
    }
}

int main() {
    vector<Data> data = readCSV("填入你的.cav文件的路径");
    if (data.empty()) {
        cerr << "CSV文件读取失败." << endl;
        return 1;  
    }

    int max = findMax(data);
    int closest50 = findClosest50(data);
    int closestDefault = findClosestDefault(data);
    int closest100 = findClosest100(data);

    writeXML(max, closest50, closestDefault, closest100);

    return 0;
}

  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Completits_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值