按key获取 txt文件的value

1. 问题描述

config.txt文件内容如下:
expo: [10000]
gain: [2.2]
width: [1280]
height: [1024]
size: [3]

要求:给定一个key(如expo),输出float类型的value(10000)。
参考网址:查找文本文件中的关键字

2. 思路

  1. 获取.txt文件的长度,即字节数length。
  2. 开劈一个length+1大小的数组char *text,保存文件数据
  3. 把文件的内容写到text数组中
  4. 进行模式串匹配,并返回keyword对应的value在text数组的首尾位置
  5. 通过value在text数组的首尾位置,为value赋值
  6. value:char型数组转换为float类型,返回float类型的Fvalue

3. 代码实现

#include <iostream>
#include <fstream>


//获取文件的长度
int GetFileLength(std::ifstream &inputFile)
{
    //保存文件当前位置  
    std::streampos pos = inputFile.tellg();

    //定位到文件尾  
    inputFile.seekg(0, std::ios::end);

    //返回文件尾的偏移量,即文件的大小  
    int length = inputFile.tellg();

    //返回到文件先前的位置  
    inputFile.seekg(pos);

    return length;
}


//模式串匹配,得到keyword对应的value在text数组中的首尾位置
int IndexOf(const char *text, int &textSize, const char *match, int matchSize, int &start, int &end)
{
    int index = 0;//keyword在text中的位置

    for (int i = 0; i <= textSize - matchSize; ++i)
    {
        int j = 0;
        while (j < matchSize && match[j] == text[i + j])
        {
            ++j;
        }

        //所有的字符都与文本中的一致,则匹配成功
        if (j == matchSize)
        {
            index = i;//找到keyword在text中的位置

            //寻找value在text数组中的首尾位置
            int k = index;
            while (text[k] != '[')
            {
                k++;
                if (text[k] == '[')
                {
                    start = k + 1;
                    break;
                }
            }

            int t = start;
            while (text[t] != ']')
            {
                t++;
                if (text[t] == ']')
                {
                    end = t - 1;
                    break;
                }
            }
            return 0;
        }
    }

    //匹配失败
    return -1;
}


//实现字符串匹配
float getValue(const char *fileName, const char *keyWord)
{
    //以只读方式,打开文件fileName
    std::ifstream inputFile(fileName);
    if (!inputFile)
    {
        //打开文件失败
        std::cout << "error: unable to open input file: " << fileName << std::endl;
        return NULL;
    }

    //获得文件的长度,即字节数,并开劈一个同样大小的数组保存文件数据
    int length = GetFileLength(inputFile);
    char *text = new char[length + 1];

    //把文件的内容写到text数组中
    inputFile.read(text, length);
    inputFile.close();
    text[length] = '\0';

    //进行模式串匹配,并返回keyword在text数组的位置
    int start = 0;
    int end = 0;
    IndexOf(text, length, keyWord, strlen(keyWord), start, end);
    int valueSize = end - start + 1;

    char *value = new char[valueSize];
    for (int i = 0; i < valueSize; i++)
    {
        value[i] = text[start + i];
    }


    float Fvalue;
    Fvalue = atof(value);//char型数组转换为float类型


    delete[]text;
    delete[]value;
    return Fvalue;
}


int main()
{
    const char *fileName = "F:/按key获取txt文件的value/config.txt";
    const char *keyWord = "size";
    float value = getValue(fileName, keyWord);
    std::cout << value << std::endl;

    system("pause");
    return 0;
}

运行结果:
3
请按任意键继续…

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Python 中可以使用内置的 "json" 库来读取 JSON 数据,并遍历其中的键值对。 示例代码: ``` import json # 读取 JSON 字符串 json_string = '{"key1": "value1", "key2": "value2", "key3": "value3"}' # 解析 JSON 字符串 data = json.loads(json_string) # 遍历键值对 for key in data: value = data[key] print(f"Key: {key}, Value: {value}") ``` 输出: ``` Key: key1, Value: value1 Key: key2, Value: value2 Key: key3, Value: value3 ``` ### 回答2: 本题要求编写一个程序,首先需要读入一个正整数n和n个整数,然后计算这些数的平均值并输出。接下来,需要找出所有大于平均值的数并输出。 首先,读入正整数n和n个整数,存入数组a中。由于题目保证数据不超过长整型整数的范围,因此不需要进行数据范围的检查。 接着,计算这n个整数的平均值。可以用一个循环将所有数相加,然后除以n即可。注意要使用浮点数类型来存储平均值。 接下来,在遍历数组a时,将大于平均值的数输出。可以用一个循环遍历数组a,每当发现一个数大于平均值时,输出该数,然后在这个数后面输出一个空格。 最后,注意特殊情况的处理。如果输入的n不在有效范围内,则需要输出"invalid."。如果没有满足条件的数需要输出空行。 参考代码如下: ### 回答3: 这道题需要我们实现两个功能:一是计算平均值,二是找出大于平均值的数。 首先读入输入的n和n个整数,存入数组a中。计算平均值的方法是将所有数相加,然后除以n。具体实现可以使用一个for循环来遍历数组a,将数组元素累加到一个变量中,最后将其除以n得到平均值。需要注意的是,计算平均值的过程中要注意数据类型,以避免溢出或精度问题。 接下来,再次遍历数组a,找出大于平均值的数,并将它们输出。由于不知道有多少个符合条件的数,我们需要使用一个动态数组来存储这些数。具体实现可以使用一个for循环遍历数组a,对于每个大于平均值的元素,将其添加到动态数组中。最后,遍历动态数组,将其中的元素输出即可。 如果输入的n不满足要求,则直接输出"invalid."即可。 完整代码如下:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值