背景
从txt格式的文本文件中获取指定区域的内容,并获得指定的值。
参考
(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)确定文本文件中的字符串所在的行并输出行数
代码
文本文件的片段:
...
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;