c++ 获取 txt 文件中指定行数之间的内容

  1. 背景
    从txt格式的文本文件中获取指定区域的内容,并获得指定的值。

  2. 参考
    (1)c语言获取文件第n行数据
    (2)C语言获取某个文件中一行内容中指定字符串后的值
    (3)C语言定位并抓取文件中的特定字符串
    (4)C++用fscanf()函数读取TXT文件内容
    (5)C 库函数 - fscanf()
    (6)C语言读取文件(二)——fscanf 详谈
    (7)【C++】读取txt文件中指定行的内容
    (8)invalid conversion from ‘const char*’ to ‘char*’解决方法
    (9)确定文本文件中的字符串所在的行并输出行数

  3. 代码
    文本文件的片段:

...
VerticalView\ShowMaxX=100
VerticalView\ShowMaxY=120
VerticalView\ShowMinX=-90
VerticalView\ShowMinY=-20

[Lidar_1]
LidarOffset\LidarHeading=0
LidarOffset\LidarHeight=6.404266
LidarOffset\LidarPitch=-2.175883
LidarOffset\LidarRoll=1.213194
LidarOffset\TranslationX=0
LidarOffset\TranslationY=0
LidarOffset\TranslationZ=0

[Lidar_2]
LidarOffset\LidarHeading=268.00
LidarOffset\LidarHeight=6.526736
LidarOffset\LidarPitch=1.635848
LidarOffset\LidarRoll=2.292384
LidarOffset\TranslationX=-58.40
LidarOffset\TranslationY=46.96
LidarOffset\TranslationZ=0.10
...

(1)从文本文件中获取两个字符串所在行之间的内容,如 [Lidar_1][Lidar_2] 之间的内容:

void GetConfigStringValue(const char *flag1,const char *flag2,const char* keyName, char* keyValue)
{


    ifstream infile(config_file.c_str());
    int linenum = 0;
    std::string line;
    bool lidar1_found = false;
    while (getline(infile, line)) {
        if (line.find(flag1) != std::string::npos) {
            lidar1_found = true;
            continue;
        }
        linenum++;
        if (lidar1_found) {
            if (line.find(flag2) != std::string::npos) {
                break;
            }

            char* tempKeyName = strtok((char*)line.data(), "=");
            if (!tempKeyName) continue;
            char* tempKeyValue = strtok(NULL, "=");

            if (!strcmp(tempKeyName, keyName))
                strcpy(keyValue, tempKeyValue);

        }
    }
//    std::cout << linenum << std::endl;
    infile.close();

}

调用:

char LidarHeight[200] = { 0 };
GetConfigStringValue("[Lidar_1]","[Lidar_2]","LidarOffset\\LidarHeight",LidarHeight);
std::cout << (float)atof(LidarHeight) << std::endl;

(2)从文本文件中获取字符串所在行和该行之后7行之间的内容:

struct CONFIG
{

    float LidarHeading = 0.0;
    float LidarPitch = 0.0;
    float LidarRoll = 0.0;

    float LidarHeight = 0.0;
    float TranslationX = 0.0;
    float TranslationY = 0.0;
    float TranslationZ = 0.0;

};
void GetConfigStringValue(const char *flag,const char* keyName, char* keyValue)
{
    ifstream infile(config_file.c_str());
    std::string line;

    // 遍历文件的每一行
    while (std::getline(infile, line)) {
        // 查找目标行
        if (line == flag) {
            // 找到目标行后,向下读取7行内容
            for (int i = 0; i < 7 && std::getline(infile, line) ; ++i) {
                //std::cout << "i :" << i << std::endl;
                char* tempKeyName = strtok((char*)line.data(), "=");
                if (!tempKeyName) continue;
                char* tempKeyValue = strtok(NULL, "=");

                if (!strcmp(tempKeyName, keyName))
                    strcpy(keyValue, tempKeyValue);
            }
            break; // 结束循环
        }
    }


}

void GetStructAccordingToFlag(const char *flag,CONFIG & config_lidar){
    char LidarHeight[200] = { 0 };
    char LidarHeading[200] = { 0 };
    char LidarPitch[200] = { 0 };
    char LidarRoll[100] = { 0 };
    char TranslationX[100] = { 0 };
    char TranslationY[100] = { 0 };
    char TranslationZ[100] = { 0 };

    GetConfigStringValue(flag,"LidarOffset\\LidarHeight",LidarHeight);
    GetConfigStringValue(flag,"LidarOffset\\LidarHeading",LidarHeading);
    GetConfigStringValue(flag,"LidarOffset\\LidarPitch",LidarPitch);
    GetConfigStringValue(flag,"LidarOffset\\LidarRoll",LidarRoll);
    GetConfigStringValue(flag,"LidarOffset\\TranslationX",TranslationX);
    GetConfigStringValue(flag,"LidarOffset\\TranslationY",TranslationY);
    GetConfigStringValue(flag,"LidarOffset\\TranslationZ",TranslationZ);


    config_lidar.LidarHeight =(float)atof(LidarHeight);
    config_lidar.LidarHeading =(float)atof(LidarHeading);
    config_lidar.LidarPitch =(float)atof(LidarPitch);
    config_lidar.LidarRoll =(float)atof(LidarRoll);
    config_lidar.TranslationX =(float)atof(TranslationX);
    config_lidar.TranslationY =(float)atof(TranslationY);
    config_lidar.TranslationZ =(float)atof(TranslationZ);

}

调用过程:

CONFIG config_lidar2;
GetStructAccordingToFlag("[Lidar_2]",config_lidar2);
std::cout << config_lidar2.LidarRoll << std::endl;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值