图2
因为目前在做项目,可是没学习过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:
输入Data2.txt:
输出Data2Extract.txt:
#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;
最终代码如下:
Input(Data2.txt):
Output(Data2Extract.txt):
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 中提取一些行,是否就直接对其文件进行行提取,然后再存入另一个文件?
再多问一句,我还需要再提取出来的 Data2Extract.txt 中提取一些行,是否就直接对其文件进行行提取,然后再存入另一个文件?
#5
@JiMoKuangXiangQu
可否再帮我解决一下我追问的问题, 我只需要Data2Extract.txt中的相等间隔行数的一些行数据,间隔由手动输入。大侠可否帮小弟实现一下,感激不尽。
可否再帮我解决一下我追问的问题, 我只需要Data2Extract.txt中的相等间隔行数的一些行数据,间隔由手动输入。大侠可否帮小弟实现一下,感激不尽。
#6
嗯,谢谢提醒,最后的一个代码中已经修正了这个问题。
这个取决于LZ要怎么用法。
#7
没明白LZ的意思,LZ可否具体描述一下?
#8
其实这是一个图片的数据,我的目的是在图片上选择相同间隔的点,然后对其进行处理,所以我想在提取出的X,Y,Lat,三列中提取出一些行的数据
#9
@JiMoKuangXiangQu
可否再帮我解决一下我追问的问题, 我只需要Data2Extract.txt中的相等间隔行数的一些行数据,间隔由手动输入。大侠可否帮小弟实现一下,感激不尽。
没明白LZ的意思,LZ可否具体描述一下?
比如说我想提取 第一行,第五行,第九行,。。。所以我就输入3,因为他们之间相隔三行。不知小弟表达清楚没有。
#10
多谢大侠。大侠是一时疏忽写错了 19行 double getMapY() const { return Map X; }
再多问一句,我还需要再提取出来的 Data2Extract.txt 中提取一些行,是否就直接对其文件进行行提取,然后再存入另一个文件?
嗯,谢谢提醒,最后的一个代码中已经修正了这个问题。
这个取决于LZ要怎么用法。
其实这是一个图片的数据,我的目的是在图片上选择相同间隔的点,然后对其进行处理,所以我想在提取出的X,Y,Lat,三列中提取出一些行的数据
大概明白你的意思了。不过要提取的目标行有什么特征或者规律吗?
譬如,可能LZ的提取要求像如下之一:
. 提取行的某(些)列的数据在一个范围内,譬如Map X在[60, 68]范围内;
或
. 从某一行开始,每间隔4行提取一行某些列的数据。
等等......
#11
多谢大侠。大侠是一时疏忽写错了 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
@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
这类函数的用法,还是要做到“拳不离手,曲不离口”的。
没实际编译链接调试,不保证对,仅供参考:
“用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
记不得哪位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
记不得哪位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:
输入Data2.txt:
输出Data2Extract.txt:
#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;
最终代码如下:
Input(Data2.txt):
Output(Data2Extract.txt):
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 中提取一些行,是否就直接对其文件进行行提取,然后再存入另一个文件?
再多问一句,我还需要再提取出来的 Data2Extract.txt 中提取一些行,是否就直接对其文件进行行提取,然后再存入另一个文件?
#5
@JiMoKuangXiangQu
可否再帮我解决一下我追问的问题, 我只需要Data2Extract.txt中的相等间隔行数的一些行数据,间隔由手动输入。大侠可否帮小弟实现一下,感激不尽。
可否再帮我解决一下我追问的问题, 我只需要Data2Extract.txt中的相等间隔行数的一些行数据,间隔由手动输入。大侠可否帮小弟实现一下,感激不尽。
#6
多谢大侠。大侠是一时疏忽写错了 19行 double getMapY() const { return Map X; }
再多问一句,我还需要再提取出来的 Data2Extract.txt 中提取一些行,是否就直接对其文件进行行提取,然后再存入另一个文件?
嗯,谢谢提醒,最后的一个代码中已经修正了这个问题。
这个取决于LZ要怎么用法。
#7
@JiMoKuangXiangQu
可否再帮我解决一下我追问的问题, 我只需要Data2Extract.txt中的相等间隔行数的一些行数据,间隔由手动输入。大侠可否帮小弟实现一下,感激不尽。
没明白LZ的意思,LZ可否具体描述一下?
#8
多谢大侠。大侠是一时疏忽写错了 19行 double getMapY() const { return Map X; }
再多问一句,我还需要再提取出来的 Data2Extract.txt 中提取一些行,是否就直接对其文件进行行提取,然后再存入另一个文件?
嗯,谢谢提醒,最后的一个代码中已经修正了这个问题。
这个取决于LZ要怎么用法。
其实这是一个图片的数据,我的目的是在图片上选择相同间隔的点,然后对其进行处理,所以我想在提取出的X,Y,Lat,三列中提取出一些行的数据
#9
@JiMoKuangXiangQu
可否再帮我解决一下我追问的问题, 我只需要Data2Extract.txt中的相等间隔行数的一些行数据,间隔由手动输入。大侠可否帮小弟实现一下,感激不尽。
没明白LZ的意思,LZ可否具体描述一下?
比如说我想提取 第一行,第五行,第九行,。。。所以我就输入3,因为他们之间相隔三行。不知小弟表达清楚没有。
#10
多谢大侠。大侠是一时疏忽写错了 19行 double getMapY() const { return Map X; }
再多问一句,我还需要再提取出来的 Data2Extract.txt 中提取一些行,是否就直接对其文件进行行提取,然后再存入另一个文件?
嗯,谢谢提醒,最后的一个代码中已经修正了这个问题。
这个取决于LZ要怎么用法。
其实这是一个图片的数据,我的目的是在图片上选择相同间隔的点,然后对其进行处理,所以我想在提取出的X,Y,Lat,三列中提取出一些行的数据
大概明白你的意思了。不过要提取的目标行有什么特征或者规律吗?
譬如,可能LZ的提取要求像如下之一:
. 提取行的某(些)列的数据在一个范围内,譬如Map X在[60, 68]范围内;
或
. 从某一行开始,每间隔4行提取一行某些列的数据。
等等......
#11
多谢大侠。大侠是一时疏忽写错了 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
@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
这类函数的用法,还是要做到“拳不离手,曲不离口”的。
没实际编译链接调试,不保证对,仅供参考:
“用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
记不得哪位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
记不得哪位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 谢大侠耐心指导。