-
背景
从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;