C++ 文本数据处理

时间:2022-12-20 21:03:06
图1
C++ 文本数据处理
图2
C++ 文本数据处理

因为目前在做项目,可是没学习过C++语言,但是想要使用C++语言在 (图1)所示的txt文本中提取 圈住的数据,然后以原来的格式存放 到另外一个文本中(如图2);求大神给予解答,有详细代码最好。多谢。

16 个解决方案

#1


#include <fstream>
#include <string>
#include <sstream>
#include <iomanip>
#include <iostream>

using namespace std;


class Record {
friend istream& operator>>(istream&, Record&);

public:
Record() : ID(0), X(0), Y(0), 
   MapX(0.0), MapY(0.0), 
   Lat(0.0), Lon(0.0), B1(0.0) { }

double getMapX() const { return MapX; }
double getMapY() const { return MapX; }
double getLat() const { return Lat; }

private:
int ID, X, Y;
double MapX, MapY;
double Lat, Lon, B1;
};


istream& operator>>(istream& is, Record& r)
{
is >> r.ID >> r.X >> r.Y 
>> r.MapX >> r.MapY
>> r.Lat >> r.Lon >> r.B1;
return is;
}


int main()
{
ifstream ifile("Data2.txt");
ofstream ofile("Data2Extract.txt");

string line;
while (getline(ifile, line))
{
if (line[0] == ';') continue;

istringstream iss(line);
Record r;
iss >> r;
ofile << setiosflags(ios::fixed) 
<< r.getMapX() << '\t' << r.getMapY() << '\t' << r.getLat() << endl;
//cout << r.getMapX() << ' ' << r.getMapY() << ' ' << r.getLat() << endl;
}

ifile.close();
ofile.close();

cin.get();
return 0;
}


有些问题。

输入Data2.txt:
; ENVI
; Number of ROIs: 1
; ID  X  Y  Map X  Map Y  Lat  Lon  B1
1   1  1  638627.36  3281165.61  29.654362  106.432289  25.2301
2   2  1  638657.36  3281165.61  29.654358  106.432599  25.2301
3   3  1  638687.36  3281165.61  29.654355  106.432909  25.2301
4   4  1  638717.36  3281165.61  29.654352  106.433219  25.2301


输出Data2Extract.txt:
638627.360000	638627.360000	29.654362
638657.360000 638657.360000 29.654358
638687.360000 638687.360000 29.654355
638717.360000 638717.360000 29.654352

#2


方案2:
#include <fstream>
#include <string>
#include <sstream>
#include <iomanip>
#include <iostream>

using namespace std;


class Record {
friend istream& operator>>(istream&, Record&);

public:
#if 1
string getMapX() const { return MapX; }
string getMapY() const { return MapX; }
string getLat() const { return Lat; }
#else
Record() : ID(0), X(0), Y(0), 
   MapX(0.0), MapY(0.0), 
   Lat(0.0), Lon(0.0), B1(0.0) { }

double getMapX() const { return MapX; }
double getMapY() const { return MapX; }
double getLat() const { return Lat; }
#endif

private:
#if 1
string ID, X, Y;
string MapX, MapY;
string Lat, Lon, B1;
#else
int ID, X, Y;
double MapX, MapY;
double Lat, Lon, B1;
#endif
};


istream& operator>>(istream& is, Record& r)
{
is >> r.ID >> r.X >> r.Y 
>> r.MapX >> r.MapY
>> r.Lat >> r.Lon >> r.B1;
return is;
}


int main()
{
ifstream ifile("Data2.txt");
ofstream ofile("Data2Extract.txt");

string line;
while (getline(ifile, line))
{
if (line[0] == ';') continue;

istringstream iss(line);
Record r;
iss >> r;
#if 1
ofile << r.getMapX() << ' ' << r.getMapY() << ' ' << r.getLat() << endl;
#else
ofile << setiosflags(ios::fixed) 
<< r.getMapX() << '\t' << r.getMapY() << '\t' << r.getLat() << endl;
//cout << r.getMapX() << ' ' << r.getMapY() << ' ' << r.getLat() << endl;
#endif
}

ifile.close();
ofile.close();

cin.get();
return 0;
}


输入Data2.txt:
; ENVI
; Number of ROIs: 1
; ID  X  Y  Map X  Map Y  Lat  Lon  B1
1   1  1  638627.36  3281165.61  29.654362  106.432289  25.2301
2   2  1  638657.36  3281165.61  29.654358  106.432599  25.2301
3   3  1  638687.36  3281165.61  29.654355  106.432909  25.2301
4   4  1  638717.36  3281165.61  29.654352  106.433219  25.2301


输出Data2Extract.txt:
638627.36 638627.36 29.654362
638657.36 638657.36 29.654358
638687.36 638687.36 29.654355
638717.36 638717.36 29.654352

#3


最后修正一下函数getMapY(),2个版本都应该返回MapY:
return MapY;

最终代码如下:
#include <fstream>
#include <string>
#include <sstream>
#include <iostream>

using namespace std;


class Record {
friend istream& operator>>(istream&, Record&);

public:
string getMapX() const { return MapX; }
string getMapY() const { return MapY; }
string getLat() const { return Lat; }

private:
string ID, X, Y;
string MapX, MapY;
string Lat, Lon, B1;
};


istream& operator>>(istream& is, Record& r)
{
is >> r.ID >> r.X >> r.Y 
>> r.MapX >> r.MapY
>> r.Lat >> r.Lon >> r.B1;
return is;
}


int main()
{
ifstream ifile("Data2.txt");
ofstream ofile("Data2Extract.txt");

string line;
while (getline(ifile, line))
{
if (line[0] == ';') continue;

istringstream iss(line);
Record r;
iss >> r;
ofile << r.getMapX() << ' ' << r.getMapY() << ' ' << r.getLat() << endl;
}

ifile.close();
ofile.close();

return 0;
}


Input(Data2.txt):
; ENVI
; Number of ROIs: 1
; ID  X  Y  Map X  Map Y  Lat  Lon  B1
1   1  1  638627.36  3281165.61  29.654362  106.432289  25.2301
2   2  1  638657.36  3281165.61  29.654358  106.432599  25.2301
3   3  1  638687.36  3281165.61  29.654355  106.432909  25.2301
4   4  1  638717.36  3281165.61  29.654352  106.433219  25.2301


Output(Data2Extract.txt):
638627.36 3281165.61 29.654362
638657.36 3281165.61 29.654358
638687.36 3281165.61 29.654355
638717.36 3281165.61 29.654352

#4


多谢大侠。大侠是一时疏忽写错了 19行 double getMapY() const { return Map X; }
再多问一句,我还需要再提取出来的 Data2Extract.txt 中提取一些行,是否就直接对其文件进行行提取,然后再存入另一个文件?

#5


@JiMoKuangXiangQu    
可否再帮我解决一下我追问的问题,  我只需要Data2Extract.txt中的相等间隔行数的一些行数据,间隔由手动输入。大侠可否帮小弟实现一下,感激不尽。

#6


引用 4 楼 casen_xu 的回复:
多谢大侠。大侠是一时疏忽写错了 19行 double getMapY() const { return Map X; }
再多问一句,我还需要再提取出来的 Data2Extract.txt 中提取一些行,是否就直接对其文件进行行提取,然后再存入另一个文件?

嗯,谢谢提醒,最后的一个代码中已经修正了这个问题。
这个取决于LZ要怎么用法。

#7


引用 5 楼 casen_xu 的回复:
@JiMoKuangXiangQu    
可否再帮我解决一下我追问的问题,  我只需要Data2Extract.txt中的相等间隔行数的一些行数据,间隔由手动输入。大侠可否帮小弟实现一下,感激不尽。

没明白LZ的意思,LZ可否具体描述一下?

#8



引用 6 楼 JiMoKuangXiangQu 的回复:
Quote: 引用 4 楼 casen_xu 的回复:

多谢大侠。大侠是一时疏忽写错了 19行 double getMapY() const { return Map X; }
再多问一句,我还需要再提取出来的 Data2Extract.txt 中提取一些行,是否就直接对其文件进行行提取,然后再存入另一个文件?

嗯,谢谢提醒,最后的一个代码中已经修正了这个问题。
这个取决于LZ要怎么用法。

其实这是一个图片的数据,我的目的是在图片上选择相同间隔的点,然后对其进行处理,所以我想在提取出的X,Y,Lat,三列中提取出一些行的数据

#9


引用 7 楼 JiMoKuangXiangQu 的回复:
Quote: 引用 5 楼 casen_xu 的回复:

@JiMoKuangXiangQu    
可否再帮我解决一下我追问的问题,  我只需要Data2Extract.txt中的相等间隔行数的一些行数据,间隔由手动输入。大侠可否帮小弟实现一下,感激不尽。

没明白LZ的意思,LZ可否具体描述一下?


比如说我想提取 第一行,第五行,第九行,。。。所以我就输入3,因为他们之间相隔三行。不知小弟表达清楚没有。

#10


引用 8 楼 casen_xu 的回复:
Quote: 引用 6 楼 JiMoKuangXiangQu 的回复:

Quote: 引用 4 楼 casen_xu 的回复:

多谢大侠。大侠是一时疏忽写错了 19行 double getMapY() const { return Map X; }
再多问一句,我还需要再提取出来的 Data2Extract.txt 中提取一些行,是否就直接对其文件进行行提取,然后再存入另一个文件?

嗯,谢谢提醒,最后的一个代码中已经修正了这个问题。
这个取决于LZ要怎么用法。

其实这是一个图片的数据,我的目的是在图片上选择相同间隔的点,然后对其进行处理,所以我想在提取出的X,Y,Lat,三列中提取出一些行的数据

大概明白你的意思了。不过要提取的目标行有什么特征或者规律吗?
譬如,可能LZ的提取要求像如下之一:
. 提取行的某(些)列的数据在一个范围内,譬如Map X在[60, 68]范围内;

. 从某一行开始,每间隔4行提取一行某些列的数据。
等等......

#11


引用 10 楼 JiMoKuangXiangQu 的回复:
Quote: 引用 8 楼 casen_xu 的回复:


Quote: 引用 6 楼 JiMoKuangXiangQu 的回复:

Quote: 引用 4 楼 casen_xu 的回复:

多谢大侠。大侠是一时疏忽写错了 19行 double getMapY() const { return Map X; }
再多问一句,我还需要再提取出来的 Data2Extract.txt 中提取一些行,是否就直接对其文件进行行提取,然后再存入另一个文件?

嗯,谢谢提醒,最后的一个代码中已经修正了这个问题。
这个取决于LZ要怎么用法。

其实这是一个图片的数据,我的目的是在图片上选择相同间隔的点,然后对其进行处理,所以我想在提取出的X,Y,Lat,三列中提取出一些行的数据

大概明白你的意思了。不过要提取的目标行有什么特征或者规律吗?
譬如,可能LZ的提取要求像如下之一:
. 提取行的某(些)列的数据在一个范围内,譬如Map X在[60, 68]范围内;

. 从某一行开始,每间隔4行提取一行某些列的数据。
等等......


我的想法是,那个Y值范围是【3281165.61,3259895.61】,每一个Y值都对应有240个X值,而且所有Y是等值递减的,递减数为30,我想在相隔90的Y值中 提取行间隔为3的行数据。大侠明白了吗?

#12


引用 9 楼 casen_xu 的回复:
Quote: 引用 7 楼 JiMoKuangXiangQu 的回复:

Quote: 引用 5 楼 casen_xu 的回复:

@JiMoKuangXiangQu    
可否再帮我解决一下我追问的问题,  我只需要Data2Extract.txt中的相等间隔行数的一些行数据,间隔由手动输入。大侠可否帮小弟实现一下,感激不尽。

没明白LZ的意思,LZ可否具体描述一下?


比如说我想提取 第一行,第五行,第九行,。。。所以我就输入3,因为他们之间相隔三行。不知小弟表达清楚没有。

明白了,不用写入再读取,一次性到位就可以了。

#include <fstream>
#include <string>
#include <sstream>
#include <iostream>

using namespace std;


class Record {
friend istream& operator>>(istream&, Record&);

public:
string getMapX() const { return MapX; }
string getMapY() const { return MapY; }
string getLat() const { return Lat; }

private:
string ID, X, Y;
string MapX, MapY;
string Lat, Lon, B1;
};


istream& operator>>(istream& is, Record& r)
{
is >> r.ID >> r.X >> r.Y 
>> r.MapX >> r.MapY
>> r.Lat >> r.Lon >> r.B1;
return is;
}


int main()
{
int n, count = 0;
cout << "Please input the number of RECORDs to skip: ";
cin >> n;

ifstream ifile("Data2.txt");
ofstream ofile("Data2Extract.txt");

string line;
while (getline(ifile, line))
{
if (line[0] == ';') continue;

if (count++ % (n+1) == 0)
{
istringstream iss(line);
Record r;
iss >> r;
ofile << r.getMapX() << ' ' << r.getMapY() << ' ' << r.getLat() << endl;
}
}

ifile.close();
ofile.close();

return 0;
}


Input 1(命令行输入):
Please input the number of RECORDs to skip:  3

Input 2(Data2.txt):
; ENVI
; Number of ROIs: 1
; ID  X  Y  Map X  Map Y  Lat  Lon  B1
1   1  1  638627.36  3281165.61  29.654362  106.432289  25.2301
2   2  1  638657.36  3281165.61  29.654358  106.432599  25.2301
3   3  1  638687.36  3281165.61  29.654355  106.432909  25.2301
4   4  1  638717.36  3281165.61  29.654352  106.433219  25.2301
5   5  1  638747.36  3281165.61  29.654348  106.433529  25.2301


Output(Data2Extract.txt):
638627.36 3281165.61 29.654362
638747.36 3281165.61 29.654348

#13


记不得哪位C++大牛在哪本学习C++的书的前言里面说过
“用C语言1000行源码能完成的工作千万不要用C++重写!”

作为一个C程序员,对
 scanf,sscanf,fscanf,fgets
 printf,sprintf,fprintf
这类函数的用法,还是要做到“拳不离手,曲不离口”的。

没实际编译链接调试,不保证对,仅供参考:
#include <stdio.h>
FILE *fi,*fo;
int g,n;
char ln[1000];
int main() {
    while (1) {
        printf("Input lines gap(>0):");fflush(stdout);
        rewind(stdin);scanf("%d",&g);
        if (g>0) break;
    }
    fi=fopen("AllData.txt","r");
    if (NULL==fi) {
        printf("Can not open file AllData.txt!\n");
        return 1;
    }
    fo=fopen("txt.txt","w");
    n=0;
    while (1) {
        if (NULL==fgets(ln,1000,fi)) break;
        if (3==sscanf(ln,"%*d%*d%*d%lf%lf%lf",&d1,&d2,&d3) {
            if (0==n%g) fprintf(fo,"%9.2lf %10.2lf %9.6lf\n",d1,d2,d3);
            n++;
        }
    }
    fclose(fo);
    fclose(fi);
    return 0;
}

#14


引用 13 楼 zhao4zhong1 的回复:
记不得哪位C++大牛在哪本学习C++的书的前言里面说过
“用C语言1000行源码能完成的工作千万不要用C++重写!”

作为一个C程序员,对
 scanf,sscanf,fscanf,fgets
 printf,sprintf,fprintf
这类函数的用法,还是要做到“拳不离手,曲不离口”的。

没实际编译链接调试,不保证对,仅供参考:
#include <stdio.h>
FILE *fi,*fo;
int g,n;
char ln[1000];
int main() {
    while (1) {
        printf("Input lines gap(>0):");fflush(stdout);
        rewind(stdin);scanf("%d",&g);
        if (g>0) break;
    }
    fi=fopen("AllData.txt","r");
    if (NULL==fi) {
        printf("Can not open file AllData.txt!\n");
        return 1;
    }
    fo=fopen("txt.txt","w");
    n=0;
    while (1) {
        if (NULL==fgets(ln,1000,fi)) break;
        if (3==sscanf(ln,"%*d%*d%*d%lf%lf%lf",&d1,&d2,&d3) {
            if (0==n%g) fprintf(fo,"%9.2lf %10.2lf %9.6lf\n",d1,d2,d3);
            n++;
        }
    }
    fclose(fo);
    fclose(fi);
    return 0;
}


只是正在做的这个项目是用C++写的,我是半路接手,但又对C++不熟悉,唉,被逼无奈。多谢。

#15


引用 14 楼 casen_xu 的回复:
Quote: 引用 13 楼 zhao4zhong1 的回复:

记不得哪位C++大牛在哪本学习C++的书的前言里面说过
“用C语言1000行源码能完成的工作千万不要用C++重写!”

作为一个C程序员,对
 scanf,sscanf,fscanf,fgets
 printf,sprintf,fprintf
这类函数的用法,还是要做到“拳不离手,曲不离口”的。

没实际编译链接调试,不保证对,仅供参考:
#include <stdio.h>
FILE *fi,*fo;
int g,n;
char ln[1000];
int main() {
    while (1) {
        printf("Input lines gap(>0):");fflush(stdout);
        rewind(stdin);scanf("%d",&g);
        if (g>0) break;
    }
    fi=fopen("AllData.txt","r");
    if (NULL==fi) {
        printf("Can not open file AllData.txt!\n");
        return 1;
    }
    fo=fopen("txt.txt","w");
    n=0;
    while (1) {
        if (NULL==fgets(ln,1000,fi)) break;
        if (3==sscanf(ln,"%*d%*d%*d%lf%lf%lf",&d1,&d2,&d3) {
            if (0==n%g) fprintf(fo,"%9.2lf %10.2lf %9.6lf\n",d1,d2,d3);
            n++;
        }
    }
    fclose(fo);
    fclose(fi);
    return 0;
}


只是正在做的这个项目是用C++写的,我是半路接手,但又对C++不熟悉,唉,被逼无奈。多谢。

#12的回复就是每隔指定间隔行数写指定列到输出文件。
如果是LZ要求的
“我的想法是,那个Y值范围是【3281165.61,3259895.61】,每一个Y值都对应有240个X值,而且所有Y是等值递减的,递减数为30,我想在相隔90的Y值中 提取行间隔为3的行数据。大侠明白了吗?”
只要修改main函数里面的判断条件:
if (count++ % (n+1) == 0)

就好了。至于具体怎么修改,有待LZ努力了,呵呵。

#16


@JiMoKuangXiangQu  谢大侠耐心指导。

#1


#include <fstream>
#include <string>
#include <sstream>
#include <iomanip>
#include <iostream>

using namespace std;


class Record {
friend istream& operator>>(istream&, Record&);

public:
Record() : ID(0), X(0), Y(0), 
   MapX(0.0), MapY(0.0), 
   Lat(0.0), Lon(0.0), B1(0.0) { }

double getMapX() const { return MapX; }
double getMapY() const { return MapX; }
double getLat() const { return Lat; }

private:
int ID, X, Y;
double MapX, MapY;
double Lat, Lon, B1;
};


istream& operator>>(istream& is, Record& r)
{
is >> r.ID >> r.X >> r.Y 
>> r.MapX >> r.MapY
>> r.Lat >> r.Lon >> r.B1;
return is;
}


int main()
{
ifstream ifile("Data2.txt");
ofstream ofile("Data2Extract.txt");

string line;
while (getline(ifile, line))
{
if (line[0] == ';') continue;

istringstream iss(line);
Record r;
iss >> r;
ofile << setiosflags(ios::fixed) 
<< r.getMapX() << '\t' << r.getMapY() << '\t' << r.getLat() << endl;
//cout << r.getMapX() << ' ' << r.getMapY() << ' ' << r.getLat() << endl;
}

ifile.close();
ofile.close();

cin.get();
return 0;
}


有些问题。

输入Data2.txt:
; ENVI
; Number of ROIs: 1
; ID  X  Y  Map X  Map Y  Lat  Lon  B1
1   1  1  638627.36  3281165.61  29.654362  106.432289  25.2301
2   2  1  638657.36  3281165.61  29.654358  106.432599  25.2301
3   3  1  638687.36  3281165.61  29.654355  106.432909  25.2301
4   4  1  638717.36  3281165.61  29.654352  106.433219  25.2301


输出Data2Extract.txt:
638627.360000	638627.360000	29.654362
638657.360000 638657.360000 29.654358
638687.360000 638687.360000 29.654355
638717.360000 638717.360000 29.654352

#2


方案2:
#include <fstream>
#include <string>
#include <sstream>
#include <iomanip>
#include <iostream>

using namespace std;


class Record {
friend istream& operator>>(istream&, Record&);

public:
#if 1
string getMapX() const { return MapX; }
string getMapY() const { return MapX; }
string getLat() const { return Lat; }
#else
Record() : ID(0), X(0), Y(0), 
   MapX(0.0), MapY(0.0), 
   Lat(0.0), Lon(0.0), B1(0.0) { }

double getMapX() const { return MapX; }
double getMapY() const { return MapX; }
double getLat() const { return Lat; }
#endif

private:
#if 1
string ID, X, Y;
string MapX, MapY;
string Lat, Lon, B1;
#else
int ID, X, Y;
double MapX, MapY;
double Lat, Lon, B1;
#endif
};


istream& operator>>(istream& is, Record& r)
{
is >> r.ID >> r.X >> r.Y 
>> r.MapX >> r.MapY
>> r.Lat >> r.Lon >> r.B1;
return is;
}


int main()
{
ifstream ifile("Data2.txt");
ofstream ofile("Data2Extract.txt");

string line;
while (getline(ifile, line))
{
if (line[0] == ';') continue;

istringstream iss(line);
Record r;
iss >> r;
#if 1
ofile << r.getMapX() << ' ' << r.getMapY() << ' ' << r.getLat() << endl;
#else
ofile << setiosflags(ios::fixed) 
<< r.getMapX() << '\t' << r.getMapY() << '\t' << r.getLat() << endl;
//cout << r.getMapX() << ' ' << r.getMapY() << ' ' << r.getLat() << endl;
#endif
}

ifile.close();
ofile.close();

cin.get();
return 0;
}


输入Data2.txt:
; ENVI
; Number of ROIs: 1
; ID  X  Y  Map X  Map Y  Lat  Lon  B1
1   1  1  638627.36  3281165.61  29.654362  106.432289  25.2301
2   2  1  638657.36  3281165.61  29.654358  106.432599  25.2301
3   3  1  638687.36  3281165.61  29.654355  106.432909  25.2301
4   4  1  638717.36  3281165.61  29.654352  106.433219  25.2301


输出Data2Extract.txt:
638627.36 638627.36 29.654362
638657.36 638657.36 29.654358
638687.36 638687.36 29.654355
638717.36 638717.36 29.654352

#3


最后修正一下函数getMapY(),2个版本都应该返回MapY:
return MapY;

最终代码如下:
#include <fstream>
#include <string>
#include <sstream>
#include <iostream>

using namespace std;


class Record {
friend istream& operator>>(istream&, Record&);

public:
string getMapX() const { return MapX; }
string getMapY() const { return MapY; }
string getLat() const { return Lat; }

private:
string ID, X, Y;
string MapX, MapY;
string Lat, Lon, B1;
};


istream& operator>>(istream& is, Record& r)
{
is >> r.ID >> r.X >> r.Y 
>> r.MapX >> r.MapY
>> r.Lat >> r.Lon >> r.B1;
return is;
}


int main()
{
ifstream ifile("Data2.txt");
ofstream ofile("Data2Extract.txt");

string line;
while (getline(ifile, line))
{
if (line[0] == ';') continue;

istringstream iss(line);
Record r;
iss >> r;
ofile << r.getMapX() << ' ' << r.getMapY() << ' ' << r.getLat() << endl;
}

ifile.close();
ofile.close();

return 0;
}


Input(Data2.txt):
; ENVI
; Number of ROIs: 1
; ID  X  Y  Map X  Map Y  Lat  Lon  B1
1   1  1  638627.36  3281165.61  29.654362  106.432289  25.2301
2   2  1  638657.36  3281165.61  29.654358  106.432599  25.2301
3   3  1  638687.36  3281165.61  29.654355  106.432909  25.2301
4   4  1  638717.36  3281165.61  29.654352  106.433219  25.2301


Output(Data2Extract.txt):
638627.36 3281165.61 29.654362
638657.36 3281165.61 29.654358
638687.36 3281165.61 29.654355
638717.36 3281165.61 29.654352

#4


多谢大侠。大侠是一时疏忽写错了 19行 double getMapY() const { return Map X; }
再多问一句,我还需要再提取出来的 Data2Extract.txt 中提取一些行,是否就直接对其文件进行行提取,然后再存入另一个文件?

#5


@JiMoKuangXiangQu    
可否再帮我解决一下我追问的问题,  我只需要Data2Extract.txt中的相等间隔行数的一些行数据,间隔由手动输入。大侠可否帮小弟实现一下,感激不尽。

#6


引用 4 楼 casen_xu 的回复:
多谢大侠。大侠是一时疏忽写错了 19行 double getMapY() const { return Map X; }
再多问一句,我还需要再提取出来的 Data2Extract.txt 中提取一些行,是否就直接对其文件进行行提取,然后再存入另一个文件?

嗯,谢谢提醒,最后的一个代码中已经修正了这个问题。
这个取决于LZ要怎么用法。

#7


引用 5 楼 casen_xu 的回复:
@JiMoKuangXiangQu    
可否再帮我解决一下我追问的问题,  我只需要Data2Extract.txt中的相等间隔行数的一些行数据,间隔由手动输入。大侠可否帮小弟实现一下,感激不尽。

没明白LZ的意思,LZ可否具体描述一下?

#8



引用 6 楼 JiMoKuangXiangQu 的回复:
Quote: 引用 4 楼 casen_xu 的回复:

多谢大侠。大侠是一时疏忽写错了 19行 double getMapY() const { return Map X; }
再多问一句,我还需要再提取出来的 Data2Extract.txt 中提取一些行,是否就直接对其文件进行行提取,然后再存入另一个文件?

嗯,谢谢提醒,最后的一个代码中已经修正了这个问题。
这个取决于LZ要怎么用法。

其实这是一个图片的数据,我的目的是在图片上选择相同间隔的点,然后对其进行处理,所以我想在提取出的X,Y,Lat,三列中提取出一些行的数据

#9


引用 7 楼 JiMoKuangXiangQu 的回复:
Quote: 引用 5 楼 casen_xu 的回复:

@JiMoKuangXiangQu    
可否再帮我解决一下我追问的问题,  我只需要Data2Extract.txt中的相等间隔行数的一些行数据,间隔由手动输入。大侠可否帮小弟实现一下,感激不尽。

没明白LZ的意思,LZ可否具体描述一下?


比如说我想提取 第一行,第五行,第九行,。。。所以我就输入3,因为他们之间相隔三行。不知小弟表达清楚没有。

#10


引用 8 楼 casen_xu 的回复:
Quote: 引用 6 楼 JiMoKuangXiangQu 的回复:

Quote: 引用 4 楼 casen_xu 的回复:

多谢大侠。大侠是一时疏忽写错了 19行 double getMapY() const { return Map X; }
再多问一句,我还需要再提取出来的 Data2Extract.txt 中提取一些行,是否就直接对其文件进行行提取,然后再存入另一个文件?

嗯,谢谢提醒,最后的一个代码中已经修正了这个问题。
这个取决于LZ要怎么用法。

其实这是一个图片的数据,我的目的是在图片上选择相同间隔的点,然后对其进行处理,所以我想在提取出的X,Y,Lat,三列中提取出一些行的数据

大概明白你的意思了。不过要提取的目标行有什么特征或者规律吗?
譬如,可能LZ的提取要求像如下之一:
. 提取行的某(些)列的数据在一个范围内,譬如Map X在[60, 68]范围内;

. 从某一行开始,每间隔4行提取一行某些列的数据。
等等......

#11


引用 10 楼 JiMoKuangXiangQu 的回复:
Quote: 引用 8 楼 casen_xu 的回复:


Quote: 引用 6 楼 JiMoKuangXiangQu 的回复:

Quote: 引用 4 楼 casen_xu 的回复:

多谢大侠。大侠是一时疏忽写错了 19行 double getMapY() const { return Map X; }
再多问一句,我还需要再提取出来的 Data2Extract.txt 中提取一些行,是否就直接对其文件进行行提取,然后再存入另一个文件?

嗯,谢谢提醒,最后的一个代码中已经修正了这个问题。
这个取决于LZ要怎么用法。

其实这是一个图片的数据,我的目的是在图片上选择相同间隔的点,然后对其进行处理,所以我想在提取出的X,Y,Lat,三列中提取出一些行的数据

大概明白你的意思了。不过要提取的目标行有什么特征或者规律吗?
譬如,可能LZ的提取要求像如下之一:
. 提取行的某(些)列的数据在一个范围内,譬如Map X在[60, 68]范围内;

. 从某一行开始,每间隔4行提取一行某些列的数据。
等等......


我的想法是,那个Y值范围是【3281165.61,3259895.61】,每一个Y值都对应有240个X值,而且所有Y是等值递减的,递减数为30,我想在相隔90的Y值中 提取行间隔为3的行数据。大侠明白了吗?

#12


引用 9 楼 casen_xu 的回复:
Quote: 引用 7 楼 JiMoKuangXiangQu 的回复:

Quote: 引用 5 楼 casen_xu 的回复:

@JiMoKuangXiangQu    
可否再帮我解决一下我追问的问题,  我只需要Data2Extract.txt中的相等间隔行数的一些行数据,间隔由手动输入。大侠可否帮小弟实现一下,感激不尽。

没明白LZ的意思,LZ可否具体描述一下?


比如说我想提取 第一行,第五行,第九行,。。。所以我就输入3,因为他们之间相隔三行。不知小弟表达清楚没有。

明白了,不用写入再读取,一次性到位就可以了。

#include <fstream>
#include <string>
#include <sstream>
#include <iostream>

using namespace std;


class Record {
friend istream& operator>>(istream&, Record&);

public:
string getMapX() const { return MapX; }
string getMapY() const { return MapY; }
string getLat() const { return Lat; }

private:
string ID, X, Y;
string MapX, MapY;
string Lat, Lon, B1;
};


istream& operator>>(istream& is, Record& r)
{
is >> r.ID >> r.X >> r.Y 
>> r.MapX >> r.MapY
>> r.Lat >> r.Lon >> r.B1;
return is;
}


int main()
{
int n, count = 0;
cout << "Please input the number of RECORDs to skip: ";
cin >> n;

ifstream ifile("Data2.txt");
ofstream ofile("Data2Extract.txt");

string line;
while (getline(ifile, line))
{
if (line[0] == ';') continue;

if (count++ % (n+1) == 0)
{
istringstream iss(line);
Record r;
iss >> r;
ofile << r.getMapX() << ' ' << r.getMapY() << ' ' << r.getLat() << endl;
}
}

ifile.close();
ofile.close();

return 0;
}


Input 1(命令行输入):
Please input the number of RECORDs to skip:  3

Input 2(Data2.txt):
; ENVI
; Number of ROIs: 1
; ID  X  Y  Map X  Map Y  Lat  Lon  B1
1   1  1  638627.36  3281165.61  29.654362  106.432289  25.2301
2   2  1  638657.36  3281165.61  29.654358  106.432599  25.2301
3   3  1  638687.36  3281165.61  29.654355  106.432909  25.2301
4   4  1  638717.36  3281165.61  29.654352  106.433219  25.2301
5   5  1  638747.36  3281165.61  29.654348  106.433529  25.2301


Output(Data2Extract.txt):
638627.36 3281165.61 29.654362
638747.36 3281165.61 29.654348

#13


记不得哪位C++大牛在哪本学习C++的书的前言里面说过
“用C语言1000行源码能完成的工作千万不要用C++重写!”

作为一个C程序员,对
 scanf,sscanf,fscanf,fgets
 printf,sprintf,fprintf
这类函数的用法,还是要做到“拳不离手,曲不离口”的。

没实际编译链接调试,不保证对,仅供参考:
#include <stdio.h>
FILE *fi,*fo;
int g,n;
char ln[1000];
int main() {
    while (1) {
        printf("Input lines gap(>0):");fflush(stdout);
        rewind(stdin);scanf("%d",&g);
        if (g>0) break;
    }
    fi=fopen("AllData.txt","r");
    if (NULL==fi) {
        printf("Can not open file AllData.txt!\n");
        return 1;
    }
    fo=fopen("txt.txt","w");
    n=0;
    while (1) {
        if (NULL==fgets(ln,1000,fi)) break;
        if (3==sscanf(ln,"%*d%*d%*d%lf%lf%lf",&d1,&d2,&d3) {
            if (0==n%g) fprintf(fo,"%9.2lf %10.2lf %9.6lf\n",d1,d2,d3);
            n++;
        }
    }
    fclose(fo);
    fclose(fi);
    return 0;
}

#14


引用 13 楼 zhao4zhong1 的回复:
记不得哪位C++大牛在哪本学习C++的书的前言里面说过
“用C语言1000行源码能完成的工作千万不要用C++重写!”

作为一个C程序员,对
 scanf,sscanf,fscanf,fgets
 printf,sprintf,fprintf
这类函数的用法,还是要做到“拳不离手,曲不离口”的。

没实际编译链接调试,不保证对,仅供参考:
#include <stdio.h>
FILE *fi,*fo;
int g,n;
char ln[1000];
int main() {
    while (1) {
        printf("Input lines gap(>0):");fflush(stdout);
        rewind(stdin);scanf("%d",&g);
        if (g>0) break;
    }
    fi=fopen("AllData.txt","r");
    if (NULL==fi) {
        printf("Can not open file AllData.txt!\n");
        return 1;
    }
    fo=fopen("txt.txt","w");
    n=0;
    while (1) {
        if (NULL==fgets(ln,1000,fi)) break;
        if (3==sscanf(ln,"%*d%*d%*d%lf%lf%lf",&d1,&d2,&d3) {
            if (0==n%g) fprintf(fo,"%9.2lf %10.2lf %9.6lf\n",d1,d2,d3);
            n++;
        }
    }
    fclose(fo);
    fclose(fi);
    return 0;
}


只是正在做的这个项目是用C++写的,我是半路接手,但又对C++不熟悉,唉,被逼无奈。多谢。

#15


引用 14 楼 casen_xu 的回复:
Quote: 引用 13 楼 zhao4zhong1 的回复:

记不得哪位C++大牛在哪本学习C++的书的前言里面说过
“用C语言1000行源码能完成的工作千万不要用C++重写!”

作为一个C程序员,对
 scanf,sscanf,fscanf,fgets
 printf,sprintf,fprintf
这类函数的用法,还是要做到“拳不离手,曲不离口”的。

没实际编译链接调试,不保证对,仅供参考:
#include <stdio.h>
FILE *fi,*fo;
int g,n;
char ln[1000];
int main() {
    while (1) {
        printf("Input lines gap(>0):");fflush(stdout);
        rewind(stdin);scanf("%d",&g);
        if (g>0) break;
    }
    fi=fopen("AllData.txt","r");
    if (NULL==fi) {
        printf("Can not open file AllData.txt!\n");
        return 1;
    }
    fo=fopen("txt.txt","w");
    n=0;
    while (1) {
        if (NULL==fgets(ln,1000,fi)) break;
        if (3==sscanf(ln,"%*d%*d%*d%lf%lf%lf",&d1,&d2,&d3) {
            if (0==n%g) fprintf(fo,"%9.2lf %10.2lf %9.6lf\n",d1,d2,d3);
            n++;
        }
    }
    fclose(fo);
    fclose(fi);
    return 0;
}


只是正在做的这个项目是用C++写的,我是半路接手,但又对C++不熟悉,唉,被逼无奈。多谢。

#12的回复就是每隔指定间隔行数写指定列到输出文件。
如果是LZ要求的
“我的想法是,那个Y值范围是【3281165.61,3259895.61】,每一个Y值都对应有240个X值,而且所有Y是等值递减的,递减数为30,我想在相隔90的Y值中 提取行间隔为3的行数据。大侠明白了吗?”
只要修改main函数里面的判断条件:
if (count++ % (n+1) == 0)

就好了。至于具体怎么修改,有待LZ努力了,呵呵。

#16


@JiMoKuangXiangQu  谢大侠耐心指导。