还是我上午问的问题,请各位大侠帮看看

时间:2021-12-08 21:22:40
现在有 这么一个 文本文件:
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,"串的行就是不要的。


#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如何呢?

#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。

#6


先搜索含有Point的行,然后再判断第8个逗号后的字符是否为'S'

#7


2楼就没理解错你的意思吧。。。

引用 5 楼 lisen07 的回复:
大家可能没 理解我的 意思。这里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,…

#8


引用 7 楼 coding_hello 的回复:
2楼就没理解错你的意思吧。。。 

引用 5 楼 lisen07 的回复:
大家可能没 理解我的 意思。这里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, gr…

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,"串的行就是不要的。


#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如何呢?

#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。

#6


先搜索含有Point的行,然后再判断第8个逗号后的字符是否为'S'

#7


2楼就没理解错你的意思吧。。。

引用 5 楼 lisen07 的回复:
大家可能没 理解我的 意思。这里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,…

#8


引用 7 楼 coding_hello 的回复:
2楼就没理解错你的意思吧。。。 

引用 5 楼 lisen07 的回复:
大家可能没 理解我的 意思。这里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, gr…

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


记号