c++如何从dat文件第二行开始读取并将数组存到二维数组进行其他计算
x y z zb u v12.500000 2.500000 53.318800 53.318800 0.000000 0.000000 0.000000
17.500000 2.500000 53.375000 53.375000 0.000000 0.000000 0.000000
22.500000 2.500000 53.411700 53.411700 0.000000 0.000000 0.000000
27.500000 2.500000 53.464300 53.464300 0.000000 0.000000 0.000000
32.500000 2.500000 53.566500 53.566500 0.000000 0.000000 0.000000
37.500000 2.500000 53.643300 53.643300 0.000000 0.000000 0.000000
42.500000 2.500000 53.698000 53.698000 0.000000 0.000000 0.000000
47.500000 2.500000 53.726000 53.726000 0.000000 0.000000 0.000000
52.500000 2.500000 53.823500 53.823500 0.000000 0.000000 0.000000
57.500000 2.500000 53.892900 53.892900 0.000000 0.000000 0.000000
62.500000 2.500000 53.944600 53.944600 0.000000 0.000000 0.000000
67.500000 2.500000 53.968200 53.968200 0.000000 0.000000 0.000000
72.500000 2.500000 54.005900 54.005900 0.000000 0.000000 0.000000
77.500000 2.500000 54.031800 54.031800 0.000000 0.000000 0.000000
82.500000 2.500000 54.003300 54.003300 0.000000 0.000000 0.000000
87.500000 2.500000 53.875000 53.875000 0.000000 0.000000 0.000000
92.500000 2.500000 53.710000 53.710000 0.000000 0.000000 0.000000
97.500000 2.500000 61.723900 61.723900 0.000000 0.000000 0.000000
102.500000 2.500000 61.744700 61.744700 0.000000 0.000000 0.000000
107.500000 2.500000 61.758600 61.758600 0.000000 0.000000 0.000000
有个dat文件,其内数据如上,我需要将除第一行外的其余数字读出来存到二维数组以进行后续其他的计算。请问该如何实现?或者说有其他方法能空过第一行的内容的?
我在网山搜了个代码,如下,经实验可以打印出特定列的数据,且第一行的字母显示是0,请问我怎么能让这一列存到数组里方便后续计算呢?
#include <iostream>
#include <iomanip>
#include <fstream>
#include <sstream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
ifstream file_dat("C:/Users/lch/Desktop/C++/result 000100800.00000ss.dat");//创建的文件名是file_dat
if (!file_dat.is_open()) {
cout << "Unable to open myfile";
system("pause");
exit(1);
}
vector<string> vec_dat;//vec_dat 是一个流,存放读到的所有东西(不分格式)
string temp_dat;
while (getline(file_dat, temp_dat)) //利用getline()读取每一行,并按照行为单位放入到vec_dat
{
vec_dat.push_back(temp_dat);
}
cout << vec_dat << endl;
vector <float> radius;
vec_dat.erase(vec_dat.begin() + 0);//删除vec_dat中的第一个元素,vec_dat.erase(vec_dat.begin()+1,vec_dat.begin()+5)则为删除下标为1,2,3,4的元素
cout << "vec_dat中第三个元素是" << vec_dat << endl;
cout << "读入的数据为 " << endl;
for (auto column = vec_dat.begin(); column != vec_dat.end(); column++)
{
cout << *column << endl;
istringstream is(*column); //用每一行的数据初始化一个字符串输入流;
string s;
int pam = 0;
while (is >> s) //以空格为界,把istringstream中数据取出放入到依次s中
{
if (pam == 0) //获取第?列的数据
{
float r = atof(s.c_str()); //做数据类型转换,将string类型转换成float
radius.push_back(r);
cout << r << endl;
}
pam++;
}
}
cout << "读入的第6列数据为 " << endl;
for (auto column = radius.begin(); column != radius.end(); column++)
{
cout << *column << endl;
}
cout << temp_dat << endl;
system("pause");
return 1;
} #include <iostream>
#include <fstream>
#include <vector>
#include <sstream>
#include <string>
const std::vector<std::vector<double>> read_file(std::ifstream &in)
{
std::vector<std::vector<double>> ret;
std::string line;
std::getline(in, line);
while(1) {
std::stringstream ss;
if(!std::getline(in, line)) break;
ss << line;
double d;
ret.push_back(std::vector<double>());
while(ss >> d) {
ret.rbegin()->push_back(d);
}
}
return ret;
}
std::ostream &operator<<(std::ostream &os, std::vector<std::vector<double>> rhs)
{
for(const auto y: rhs) {
for(const auto x: y) {
os << x << " ";
}
os << std::endl;
}
return os;
}
int main(void)
{
std::ifstream in("result.dat");
std::vector<std::vector<double>> data = read_file(in);
std::cout << data << std::endl;
return 0;
}
本帖最后由 超级卡布达 于 2020-3-17 00:08 编辑
人造人 发表于 2020-3-16 20:06
多谢指点,我试了下可以用data[][]取下标的方式访问数组了。再次感谢 把代码稍微改一下吧
#include <iostream>
#include <fstream>
#include <vector>
#include <sstream>
#include <string>
const std::vector<std::vector<double>> read_file(std::ifstream &in)
{
std::vector<std::vector<double>> ret;
std::string line;
std::getline(in, line);
while(1) {
std::stringstream ss;
if(!std::getline(in, line)) break;
ss << line;
double d;
ret.push_back(std::vector<double>());
while(ss >> d) {
ret.rbegin()->push_back(d);
}
}
return ret;
}
std::ostream &operator<<(std::ostream &os, const std::vector<std::vector<double>> &rhs)
{
for(const auto y: rhs) {
for(const auto x: y) {
os << x << " ";
}
os << std::endl;
}
return os;
}
int main(void)
{
std::ifstream in("result.dat");
std::vector<std::vector<double>> data = read_file(in);
std::cout << data << std::endl;
return 0;
}
人造人 发表于 2020-3-17 07:43
把代码稍微改一下吧
请问具体改了哪里,我看了下 好像没改啥? 超级卡布达 发表于 2020-3-17 17:14
请问具体改了哪里,我看了下 好像没改啥?
std::ostream &operator<<(std::ostream &os, const std::vector<std::vector<double>> &rhs) 人造人 发表于 2020-3-17 17:28
好的,感谢~ 人造人 发表于 2020-3-17 17:28
你好,请问大神 你之前写的代码怎么样能弄到一个函数里面,我想在一个别的程序里面调用这整个功能 超级卡布达 发表于 2020-3-25 22:33
你好,请问大神 你之前写的代码怎么样能弄到一个函数里面,我想在一个别的程序里面调用这整个功能
? 人造人 发表于 2020-3-25 22:36
?
之前你写的算是个独立的程序把,我现在想把他们...怎么说呢,封装成一整个函数,然后调用。 就是这些代码能不能写在一个viod ppp() {} ; 下面?这样我直接调用ppp() ; 就能用你写的整个代码的功能 麻烦大神告知一下。 超级卡布达 发表于 2020-3-25 22:41
之前你写的算是个独立的程序把,我现在想把他们...怎么说呢,封装成一整个函数,然后调用。 就是这些代码 ...
完全看不懂你的问题 人造人 发表于 2020-3-25 22:48
完全看不懂你的问题
{:5_100:}额... 好吧,我也不知道咋说了... 没事了。还是很谢谢大神{:5_109:}
页:
[1]