鱼C论坛

 找回密码
 立即注册
查看: 1520|回复: 11

[已解决]c++如何从dat文件第二行开始读取并将数组存到二维数组进行其他计算

[复制链接]
发表于 2020-3-16 18:07:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
x y z zb u v
12.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[0] << 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[2][0] << 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;
}
最佳答案
2020-3-16 20:06:43
#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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-16 20:06:43 | 显示全部楼层    本楼为最佳答案   
#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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-16 23:52:31 | 显示全部楼层
本帖最后由 超级卡布达 于 2020-3-17 00:08 编辑


多谢指点,我试了下可以用data[][]取下标的方式访问数组了。再次感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-17 07:43:17 | 显示全部楼层
把代码稍微改一下吧
#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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-17 17:14:46 | 显示全部楼层
人造人 发表于 2020-3-17 07:43
把代码稍微改一下吧

请问具体改了哪里,我看了下 好像没改啥?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-17 17:28:09 | 显示全部楼层
超级卡布达 发表于 2020-3-17 17:14
请问具体改了哪里,我看了下 好像没改啥?
std::ostream &operator<<(std::ostream &os, const std::vector<std::vector<double>> &rhs)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-17 17:46:53 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-25 22:33:55 | 显示全部楼层

你好,请问大神 你之前写的代码怎么样能弄到一个函数里面,我想在一个别的程序里面调用这整个功能
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-25 22:36:54 | 显示全部楼层
超级卡布达 发表于 2020-3-25 22:33
你好,请问大神 你之前写的代码怎么样能弄到一个函数里面,我想在一个别的程序里面调用这整个功能

?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-25 22:41:43 | 显示全部楼层

之前你写的算是个独立的程序把,我现在想把他们...怎么说呢,封装成一整个函数,然后调用。 就是这些代码能不能写在一个  viod ppp() {} ; 下面?这样我直接调用ppp() ; 就能用你写的整个代码的功能 麻烦大神告知一下。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-25 22:48:14 | 显示全部楼层
超级卡布达 发表于 2020-3-25 22:41
之前你写的算是个独立的程序把,我现在想把他们...怎么说呢,封装成一整个函数,然后调用。 就是这些代码 ...

完全看不懂你的问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-25 22:49:53 | 显示全部楼层
人造人 发表于 2020-3-25 22:48
完全看不懂你的问题

额... 好吧,我也不知道咋说了... 没事了。还是很谢谢大神
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-15 17:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表