OziExplorer Map Data File Version 2.1
Demo Map 1
E:\Gpsmap\B3release\Maps\demo1.bmp
1 TIFF scale factor
WGS 84,, 0.0000, 0.0000,WGS 84
Reserved 1
Reserved 2
Magnetic Variation,,,W
Map Projection,Latitude/Longitude,PolyCal,No,AutoCalOnly,No,BSBUseWPX,Yes
Point01,xy, 139, 227,in, deg, 26, 34.122,S, 152, 22.166,E, grid, , , ,N
Point02,xy, 1156, 689,in, deg, 26, 48.7,S, 152, 57.89,E, grid, , , ,N
Point03,xy, , ,in, deg, , ,N, , ,W, grid, , , ,N
Point04,xy, , ,in, deg, , ,N, , ,W, grid, , , ,N
Point05,xy, , ,in, deg, , ,N, , ,W, grid, , , ,N
我要读出像Point01,Point02这样的行,注意与Point03这样的行区分开来,在不同的文件中,像Point01,Point02这样的行的个数是不确定的。
哪位大侠给个正确的代码,小弟写的老是读不好,在线等,万分感谢!
10 个解决方案
#1
第一个方法:
while(getline(all_chars))
{
subchars = strtok(all_chars,",");//字符串分隔
if(subchars equal "point01" or equal "point02")
{
do your job;
}
}
第二方法:
用perl之类的脚本做一次过滤,把有用的数据保存到一个临时文件中
#2
主要是要抽象出数据的特点。
我这里用的特征是:有",W,"串的行就是不要的。
输出:
Point01,xy, 139, 227,in, deg, 26, 34.122,S, 152, 22.166,E, grid, , , ,N
Point02,xy, 1156, 689,in, deg, 26, 48.7,S, 152, 57.89,E, grid, , , ,N
Press any key to continue
我这里用的特征是:有",W,"串的行就是不要的。
#include<stdio.h>
#include<string.h>
int main()
{
FILE *in;
char str[1024];
in = fopen("d:\\xx.txt", "r"); //d:\\xx.txt的内容就是上面的文件
fgets(str, 102400, in);
do
{
if (strncmp(str, "Point", 5) == 0 && strstr(str, ",W,") == NULL)
{
printf("%s\n", str);
}
fgets(str, 102400, in);
}while(!feof(in));
fclose(in);
return 0;
}
输出:
Point01,xy, 139, 227,in, deg, 26, 34.122,S, 152, 22.166,E, grid, , , ,N
Point02,xy, 1156, 689,in, deg, 26, 48.7,S, 152, 57.89,E, grid, , , ,N
Press any key to continue
#3
像Point01,Point02这样的行的个数是不确定的。
像不确定的元素写入ini如何呢?
像不确定的元素写入ini如何呢?
#4
#include "iostream"
#include "fstream"
#include "string"
#include "sstream"
using namespace std;
int main()
{
ifstream ifile("test.txt");
if (ifile.fail())
return 1;
while (!ifile.eof())
{
string str;
getline(ifile, str);
if (str.find("Point01") == 0 || str.find("Point02") == 0)
cout<<str<<endl;
}
ifile.close();
return 0;
}
测试
假设文件 test.txt 的内容为
OziExplorer Map Data File Version 2.1
Demo Map 1
E:\Gpsmap\B3release\Maps\demo1.bmp
1 TIFF scale factor
WGS 84,, 0.0000, 0.0000,WGS 84
Reserved 1
Reserved 2
Magnetic Variation,,,W
Map Projection,Latitude/Longitude,PolyCal,No,AutoCalOnly,No,BSBUseWPX,Yes
Point01,xy, 139, 227,in, deg, 26, 34.122,S, 152, 22.166,E, grid, , , ,N
Point02,xy, 1156, 689,in, deg, 26, 48.7,S, 152, 57.89,E, grid, , , ,N
Point03,xy, , ,in, deg, , ,N, , ,W, grid, , , ,N
Point04,xy, , ,in, deg, , ,N, , ,W, grid, , , ,N
Point05,xy, , ,in, deg, , ,N, , ,W, grid, , , ,N
运行结果
Point01,xy, 139, 227,in, deg, 26, 34.122,S, 152, 22.166,E, grid, , , ,N
Point02,xy, 1156, 689,in, deg, 26, 48.7,S, 152, 57.89,E, grid, , , ,N
#5
大家可能没 理解我的 意思。这里Point01,Point02,Point03只是一些序号。也 就是 说Point03或者Point04等等,
也有 可能是和Point01,Point02的格式是一样的,比如:文件是 这样的:
Point01,xy, 139, 227,in, deg, 26, 34.122,S, 152, 22.166,E,grid, , , ,N
Point02,xy, 1156, 689,in, deg, 26, 48.7,S, 152, 57.89,E, grid, , , ,N
Point03,xy, 452 , 756 ,in, deg, 47 , 36.48 ,N, 23 , 86.32 ,W, grid, , , ,N
Point04,xy, , ,in, deg, , ,N, , ,W, grid, , , ,N
Point05,xy, , ,in, deg, , ,N, , ,W, grid, , , ,N
也就是像point1,point2这样的行的个数是 不确定的,所以不能这样str.find("Point01") == 0 || str.find("Point02") == 0。
也有 可能是和Point01,Point02的格式是一样的,比如:文件是 这样的:
Point01,xy, 139, 227,in, deg, 26, 34.122,S, 152, 22.166,E,grid, , , ,N
Point02,xy, 1156, 689,in, deg, 26, 48.7,S, 152, 57.89,E, grid, , , ,N
Point03,xy, 452 , 756 ,in, deg, 47 , 36.48 ,N, 23 , 86.32 ,W, grid, , , ,N
Point04,xy, , ,in, deg, , ,N, , ,W, grid, , , ,N
Point05,xy, , ,in, deg, , ,N, , ,W, grid, , , ,N
也就是像point1,point2这样的行的个数是 不确定的,所以不能这样str.find("Point01") == 0 || str.find("Point02") == 0。
#6
先搜索含有Point的行,然后再判断第8个逗号后的字符是否为'S'
#7
2楼就没理解错你的意思吧。。。
#8
2 楼和6楼的没 理解 错。但也不 能这么 做。
因为可能有这么一行:
Point03,xy, 452 , 756 ,in, deg, 47 , 36.48 ,N, 23 , 86.32 ,W, grid, , , ,N
当然2楼和6楼的方法是对的,只不过我 没有把具体的文件内容说清楚。
感谢 楼上所有 朋友的解答。我找到一个 很笨但管用的方法:if(m_strline[15]!=' '),作这个判断就好了
#9
#include <iostream>
#include <string>
#include <vector>
using namespace std;
typedef basic_string<char>::size_type S_T;
static const S_T npos = -1;
//-----------------------------------------------------------------------------
// 将某一字符串作为分割符分割源字符串
//-----------------------------------------------------------------------------
vector<string> split(const string& src, string tok,
bool trim=false, string null_subst="")
{
if( src.empty() || tok.empty() ) {
throw "split: empty string\0";
}
vector<string> v;
S_T pre_index = 0, index = 0, len = 0;
while( (index = src.find_first_of(tok, pre_index)) != npos )
{
if( (len = index-pre_index)!=0 )
{
v.push_back(src.substr(pre_index, len));
}
else if(trim==false) {
v.push_back(null_subst);
}
pre_index = index+1;
}
string endstr = src.substr(pre_index);
if( trim == false )
{
v.push_back( endstr.empty()? null_subst:endstr );
}
else if( !endstr.empty() ){
v.push_back(endstr);
}
return v;
}
int main() {
string str("abcdefg,aasdfef,,,fefeasdg,");
vector<string> strs = split( str, ",", false, "-" );
vector<string>::iterator strIter;
for( strIter = strs.begin(); strIter != strs.end(); strIter++ ) {
cout << *strIter << endl;
}
/*
得到的结果是:
abcdefg
aasdfef
-
-
fefeasdg
-
*/
strs = split( str, ",", true, "-" );
for( strIter = strs.begin(); strIter != strs.end(); strIter++ ) {
cout << *strIter << endl;
}
/*
得到的结果是:
abcdefg
aasdfef
fefeasdg
*/
}
楼主可按照这个方法将含有Point的字符串取出并分解,若中间有不合格的项,则该字符串无用。
#10
记号
#1
第一个方法:
while(getline(all_chars))
{
subchars = strtok(all_chars,",");//字符串分隔
if(subchars equal "point01" or equal "point02")
{
do your job;
}
}
第二方法:
用perl之类的脚本做一次过滤,把有用的数据保存到一个临时文件中
#2
主要是要抽象出数据的特点。
我这里用的特征是:有",W,"串的行就是不要的。
输出:
Point01,xy, 139, 227,in, deg, 26, 34.122,S, 152, 22.166,E, grid, , , ,N
Point02,xy, 1156, 689,in, deg, 26, 48.7,S, 152, 57.89,E, grid, , , ,N
Press any key to continue
我这里用的特征是:有",W,"串的行就是不要的。
#include<stdio.h>
#include<string.h>
int main()
{
FILE *in;
char str[1024];
in = fopen("d:\\xx.txt", "r"); //d:\\xx.txt的内容就是上面的文件
fgets(str, 102400, in);
do
{
if (strncmp(str, "Point", 5) == 0 && strstr(str, ",W,") == NULL)
{
printf("%s\n", str);
}
fgets(str, 102400, in);
}while(!feof(in));
fclose(in);
return 0;
}
输出:
Point01,xy, 139, 227,in, deg, 26, 34.122,S, 152, 22.166,E, grid, , , ,N
Point02,xy, 1156, 689,in, deg, 26, 48.7,S, 152, 57.89,E, grid, , , ,N
Press any key to continue
#3
像Point01,Point02这样的行的个数是不确定的。
像不确定的元素写入ini如何呢?
像不确定的元素写入ini如何呢?
#4
#include "iostream"
#include "fstream"
#include "string"
#include "sstream"
using namespace std;
int main()
{
ifstream ifile("test.txt");
if (ifile.fail())
return 1;
while (!ifile.eof())
{
string str;
getline(ifile, str);
if (str.find("Point01") == 0 || str.find("Point02") == 0)
cout<<str<<endl;
}
ifile.close();
return 0;
}
测试
假设文件 test.txt 的内容为
OziExplorer Map Data File Version 2.1
Demo Map 1
E:\Gpsmap\B3release\Maps\demo1.bmp
1 TIFF scale factor
WGS 84,, 0.0000, 0.0000,WGS 84
Reserved 1
Reserved 2
Magnetic Variation,,,W
Map Projection,Latitude/Longitude,PolyCal,No,AutoCalOnly,No,BSBUseWPX,Yes
Point01,xy, 139, 227,in, deg, 26, 34.122,S, 152, 22.166,E, grid, , , ,N
Point02,xy, 1156, 689,in, deg, 26, 48.7,S, 152, 57.89,E, grid, , , ,N
Point03,xy, , ,in, deg, , ,N, , ,W, grid, , , ,N
Point04,xy, , ,in, deg, , ,N, , ,W, grid, , , ,N
Point05,xy, , ,in, deg, , ,N, , ,W, grid, , , ,N
运行结果
Point01,xy, 139, 227,in, deg, 26, 34.122,S, 152, 22.166,E, grid, , , ,N
Point02,xy, 1156, 689,in, deg, 26, 48.7,S, 152, 57.89,E, grid, , , ,N
#5
大家可能没 理解我的 意思。这里Point01,Point02,Point03只是一些序号。也 就是 说Point03或者Point04等等,
也有 可能是和Point01,Point02的格式是一样的,比如:文件是 这样的:
Point01,xy, 139, 227,in, deg, 26, 34.122,S, 152, 22.166,E,grid, , , ,N
Point02,xy, 1156, 689,in, deg, 26, 48.7,S, 152, 57.89,E, grid, , , ,N
Point03,xy, 452 , 756 ,in, deg, 47 , 36.48 ,N, 23 , 86.32 ,W, grid, , , ,N
Point04,xy, , ,in, deg, , ,N, , ,W, grid, , , ,N
Point05,xy, , ,in, deg, , ,N, , ,W, grid, , , ,N
也就是像point1,point2这样的行的个数是 不确定的,所以不能这样str.find("Point01") == 0 || str.find("Point02") == 0。
也有 可能是和Point01,Point02的格式是一样的,比如:文件是 这样的:
Point01,xy, 139, 227,in, deg, 26, 34.122,S, 152, 22.166,E,grid, , , ,N
Point02,xy, 1156, 689,in, deg, 26, 48.7,S, 152, 57.89,E, grid, , , ,N
Point03,xy, 452 , 756 ,in, deg, 47 , 36.48 ,N, 23 , 86.32 ,W, grid, , , ,N
Point04,xy, , ,in, deg, , ,N, , ,W, grid, , , ,N
Point05,xy, , ,in, deg, , ,N, , ,W, grid, , , ,N
也就是像point1,point2这样的行的个数是 不确定的,所以不能这样str.find("Point01") == 0 || str.find("Point02") == 0。
#6
先搜索含有Point的行,然后再判断第8个逗号后的字符是否为'S'
#7
2楼就没理解错你的意思吧。。。
#8
2 楼和6楼的没 理解 错。但也不 能这么 做。
因为可能有这么一行:
Point03,xy, 452 , 756 ,in, deg, 47 , 36.48 ,N, 23 , 86.32 ,W, grid, , , ,N
当然2楼和6楼的方法是对的,只不过我 没有把具体的文件内容说清楚。
感谢 楼上所有 朋友的解答。我找到一个 很笨但管用的方法:if(m_strline[15]!=' '),作这个判断就好了
#9
#include <iostream>
#include <string>
#include <vector>
using namespace std;
typedef basic_string<char>::size_type S_T;
static const S_T npos = -1;
//-----------------------------------------------------------------------------
// 将某一字符串作为分割符分割源字符串
//-----------------------------------------------------------------------------
vector<string> split(const string& src, string tok,
bool trim=false, string null_subst="")
{
if( src.empty() || tok.empty() ) {
throw "split: empty string\0";
}
vector<string> v;
S_T pre_index = 0, index = 0, len = 0;
while( (index = src.find_first_of(tok, pre_index)) != npos )
{
if( (len = index-pre_index)!=0 )
{
v.push_back(src.substr(pre_index, len));
}
else if(trim==false) {
v.push_back(null_subst);
}
pre_index = index+1;
}
string endstr = src.substr(pre_index);
if( trim == false )
{
v.push_back( endstr.empty()? null_subst:endstr );
}
else if( !endstr.empty() ){
v.push_back(endstr);
}
return v;
}
int main() {
string str("abcdefg,aasdfef,,,fefeasdg,");
vector<string> strs = split( str, ",", false, "-" );
vector<string>::iterator strIter;
for( strIter = strs.begin(); strIter != strs.end(); strIter++ ) {
cout << *strIter << endl;
}
/*
得到的结果是:
abcdefg
aasdfef
-
-
fefeasdg
-
*/
strs = split( str, ",", true, "-" );
for( strIter = strs.begin(); strIter != strs.end(); strIter++ ) {
cout << *strIter << endl;
}
/*
得到的结果是:
abcdefg
aasdfef
fefeasdg
*/
}
楼主可按照这个方法将含有Point的字符串取出并分解,若中间有不合格的项,则该字符串无用。
#10
记号