24小时热门版块排行榜    

查看: 2739  |  回复: 20
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

mljphy

金虫 (正式写手)

[求助] 一下的数据如何通过C++读取

数据文件例子:test.txt
Frame
3.0   12.0  20.0
1.0    7.0  7.0
15.0  21.0  4.0
Frame
2.0   2.0    15.0
1.0   12.0   3.0
11.0  2.0   23.0
Frame
2.0   21.0   15.0
11.0  12.0   13.0
11.0   2.0   23.0

例子中共有k(k=3)组数据,每组数据n行(n=3),m列(n=3)。

想把它读入a1[k][n],a2[k][n],a3[k][n]数组中,用二维数组保存,要求数组第一个下标对应的是组数k,而第二个下标对应的是行数n,数组名已经区分了列数(实际中代表不同类型的数据,所以用不同数组明区分,后面好进行处理),这里是3列所有用了三个数组a1,a2,a3。
多谢高手指点。
回复此楼
一切都会慢慢好起来。
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

mljphy

金虫 (正式写手)

引用回帖:
11楼: Originally posted by zeppe at 2013-06-03 11:58:21
可以试试我这个看看。


#include <iostream>
#include <sstream>
#include <fstream>
#include <vector>
#include <cassert>

int main(void)
{
        // path of the input ...

谢谢你的回复。你的代码我仔细检验了。对于我原来的输入文件,在修改了路径那行:
std::string filename = "D:\\Skydrive\\MyCode\\cpp\\TreatString\\TreatString\\src\\test.txt"; //
改为
const char *filename = "D:\\Skydrive\\MyCode\\cpp\\TreatString\\TreatString\\src\\test.txt"; //
并修改重复定义的k之后能够得到正确的结果。

我试着朝我最终的输入文件修改了一下输入文件数据(test.txt),现在的数据格式如下(数字都是变量,包括16000.0):

ITEM: TIMESTEP
16000.0
Frame
5.0  2.0  4.0   5.0
1.0  4.0  11.0  11.0
3.0  6.0  15.0  77.0
1.0  6.0  15.0  28.0
ITEM: TIMESTEP
16000.0
Frame
6.0  2.0  41.0  23.0
1.0  6.0  15.0  28.0
7.0  9.0  17.0  33.0
1.0  6.0  15.0  62.0
ITEM: TIMESTEP
16000.0
Frame
9.0  4.0  11.0  41.0
3.0  6.0  12.0  62.0
8.0  9.0  17.0  89.0
7.0  6.0  13.0  28.0
ITEM: TIMESTEP
16000.0
Frame
3.0  4.0  13.0  41.0
5.0  2.0  15.0  61.0
8.0  9.0  17.0  59.0
6.0  6.0  15.0  23.0

然后我按我的理解修改了一下代码,修改后如下(在VC 6.0中 原来代码中k有重定义现象,不知何故,我该成了k1,k2,k3,k4):
#include <iostream>
#include <sstream>
#include <fstream>
#include <vector>
#include <cassert>

int main(void)
{
        // path of the input file
        const char *filename = "G:\\cpp\\2\\test.txt"; // Please edit this line according to you real path of the test.txt file
        std::ifstream infile(filename);

        // check if file exists
        if(!infile) { std::cerr << "file "<< filename << " not found." << std::endl;    }

        std::string line;  // string that stores each line read in
        std::vector<double> vals; // vector that stores values should be read
        std::vector<double> vt;

        // read file line by line
        while(std::getline(infile, line))

        {
       if(line == "ITEM: TIMESTEP" { continue;  }
       
       double vab;
        std::istringstream iss1(line);
        iss1 >> vab;
        vt.push_back(vab);

       if(line == "Frame" {  continue; }                        

        if(line == "" {  continue; }  
               
        double val1, val2, val3, val4;
        std::istringstream iss(line);
        iss >> val1 >> val2 >> val3>> val4;
        vals.push_back(val1);
        vals.push_back(val2);
        vals.push_back(val3);
        vals.push_back(val4);
        }

        // check and make sure 27 values are stored in vector vals.
        assert(vals.size() == 64);
        
      double a1[10][10], a2[10][10], a3[10][10], a4[10][10];
        int nn=4;
        // pass value from vals to a1, a2, a3
        for(size_t k = 0; k < nn; ++k)
        {
             for(size_t n = 0; n < nn; ++n)
             {
                  a1[k][n] = vals[4*k+n];
                  a2[k][n] = vals[16 + 4*k+n];
                  a3[k][n] = vals[32 + 4*k+n];
                  a4[k][n] = vals[48 + 4*k+n];
             }
        }

        // output a1, a2, a3,a4
        std::cout << "a1:"<<std::endl;
        for(size_t k1 = 0; k1 < nn; ++k1)
        {
             for(size_t n = 0; n < nn; ++n)
             std::cout<< a1[k1][n] << "\t";
             std::cout << std::endl;
        }

        std::cout << "a2:"<<std::endl;
        for(size_t k2 = 0; k2 < nn; ++k2)
        {
              for(size_t n = 0; n < nn; ++n)
              std::cout<< a2[k2][n] << "\t";
              std::cout << std::endl;
        }

        std::cout << "a3:"<<std::endl;
        for(size_t k3 = 0; k3 < nn; ++k3)
        {
              for(size_t n = 0; n < nn; ++n)
              std::cout<< a3[k3][n] << "\t";
              std::cout << std::endl;
        }

                std::cout << "a4:"<<std::endl;
        for(size_t k4 = 0; k4 < nn; ++k4)
        {
             for(size_t n = 0; n < nn; ++n)
             std::cout<< a4[k4][n] << "\t";
             std::cout << std::endl;
        }
        return 0;
}


1.我发现在加入如果输入文件(test.txt)中只加入第1,8,15,22行,并在代码中加入下列代码行:      
if(line == "ITEM: TIMESTEP" { continue;  }
程序能够正常运行,并输出正确结果。
2.如果再加入第2,9,16,23行(对应16000.0),并加入相应代码
       double vab;
        std::istringstream iss1(line);
        iss1 >> vab;
        vt.push_back(vab);
程序却不能正确运行,输出的错误为:
        assert(vals.size() == 64);
此行有问题,如果我注视掉将出现错误结果。
不知道为什么?

我最终的数据格式如下(实例):

ITEM: TIMESTEP
16000.0
Atoms
171
Coordinates
0.0  100.0
0.0  100.0
0.0  100.0
Frame
5.0  2.0  4.0   5.0    6.0
1.0  4.0  11.0  11.0   7.0
3.0  6.0  15.0  77.0   8.0
1.0  6.0  15.0  28.0   11.0
......共171行......
ITEM: TIMESTEP
16000.0
Atoms
171
Coordinates
0.0  100.0
0.0  100.0
0.0  100.0
Frame
6.0  2.0  41.0  23.0   9.9
1.0  6.0  15.0  28.0   11.7
7.0  9.0  17.0  33.0   20.8
1.0  6.0  15.0  62.0   0.9
......共171行......
ITEM: TIMESTEP
16000.0
Atoms
171
Coordinates
0.0  100.0
0.0  100.0
0.0  100.0
Frame
9.0  4.0  11.0  41.0   8.0
3.0  6.0  12.0  62.0   20.0
8.0  9.0  17.0  89.0   80.0
7.0  6.0  13.0  28.0   20.0
......共171行......
ITEM: TIMESTEP
16000.0
Atoms
171
Coordinates
0.0  100.0
0.0  100.0
0.0  100.0
Frame
3.0  4.0  13.0  41.0   12.0
5.0  2.0  15.0  61.0   15.0
8.0  9.0  17.0  59.0   22.0
6.0  6.0  15.0  23.0   88.0
......共171行......


再次感谢。
一切都会慢慢好起来。
13楼2013-06-03 17:54:42
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
查看全部 21 个回答

zhanglinfeng

新虫 (小有名气)

【答案】应助回帖

感谢参与,应助指数 +1
大致的考虑了下 , 你可以用文件流来读取数据,定义三个数组用来存储数据,至于代码要等我测试了在给你!
2楼2013-06-02 18:54:02
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zhanglinfeng

新虫 (小有名气)

【答案】应助回帖

★
xzhdty: 金币+1, 谢谢参与 2013-06-02 20:49:07
#include<iostream>
#include<fstream>
using std::cout ;

int main()
{
  const char *filename  = "test.txt 所在的绝对路径" ;
  std::ifstream is(filename ) ;
  double a1[3][3] = {0} ;
  double a2[3][3] = {0} ;
  double a3[3][3]  = {0} ;
    for (int k = 0 ; k != 3 ; ++k)
     for (int n = 0 ; n != 3 ; ++n)
   {
      //is >> data ;
       switch(n)
       {
          case 0 :
              is >> a1[k][n] >> a2[k][n] >> a3[k][n];
               break ;
         case 1 :
              is >> a1[k][n] >> a2[k][n] >> a3[k][n]  ;
               break ;
        case 2 :
               is >> a1[k][n] >> a2[k][n] >> a3[k][n]  ;
                 break ;
        }
     }
for (int k = 0 ; k != 3 ; ++k)  //为了测试正确性
35     for (int n = 0 ; n != 3 ; ++n)
36     {
37        cout << a1[k][n] << "\t" << a2[k][n] << "\t" << a3[k][n] << std::endl     ;
38     }

return 0 ;
}
3楼2013-06-02 20:25:07
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

mljphy

金虫 (正式写手)

引用回帖:
3楼: Originally posted by zhanglinfeng at 2013-06-02 20:25:07
#include<iostream>
#include<fstream>
using std::cout ;

int main()
{
  const char *filename  = "test.txt 所在的绝对路径" ;
  std::ifstream is(filename ) ;
  double a1 =  ...

首先谢谢你的热心帮助。
我测试了一下代码,似乎不对,好像没有读入,所有数据都还是零。
一切都会慢慢好起来。
4楼2013-06-02 21:14:37
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[公派出国] 售一区SCI文章T0P,我:8O.551.O54,科目全,可十急 +3 cqwQDCxMcL3I 2026-09-29 4/200 2026-09-30 13:35 by C3vABopYbZJS
[教师之家] 某top大学教授说“能够在市场中兑现的能力才是真能力”无比同意! +10 zju2000 2026-09-26 13/650 2026-09-30 10:26 by yexuqing
[有机交流] 同一个分子,一条来自文献,一条来自AI——不告诉你答案,你会选哪条? +4 tianxiaoxian 2026-09-28 7/350 2026-09-30 08:34 by 88817753
[博后之家] 售SCI文章,我:8O.5.5.1O.54,科目全,可十急 +4 IDs3scOF0tjC 2026-09-28 4/200 2026-09-29 19:27 by cqwQDCxMcL3I
[找工作] 售SCI一区T0P文章,我:8.O.55.1.O54,科目全,可伽急 +4 ZYXdhzDAy9ZX 2026-09-28 4/200 2026-09-29 16:54 by yCO1Ll7aHtsw
[博后之家] 售SCI-T0P文章,我:8O.5.5.1.O.54,科目齐全,可+急 +3 ZYXdhzDAy9ZX 2026-09-28 3/150 2026-09-29 16:30 by etmYJ6d2rquH
[硕博家园] 售SCI文章,我:8O.5.5.1O.54,科目全,可十急 +3 ZYXdhzDAy9ZX 2026-09-28 3/150 2026-09-29 16:03 by etmYJ6d2rquH
[博后之家] 售SCI文章,我:8O5.5.1.O.54,科目齐全,可+急 +3 tqUTOxClQUMF 2026-09-28 3/150 2026-09-29 15:04 by etmYJ6d2rquH
[公派出国] 售SCI一区T0P文章,我:8.O.55.1.O54,科目全,可伽急 +3 tqUTOxClQUMF 2026-09-28 3/150 2026-09-29 14:58 by etmYJ6d2rquH
[考研] 售SCI一区T0P文章,我:8.O.55.1.O.54,科目齐全,可+急 +3 CfXuS1rDhLYN 2026-09-28 3/150 2026-09-29 14:24 by etmYJ6d2rquH
[找工作] 售SCI一区文章,我:8.O.55.1.O.54,科目齐全,可伽急 +6 IDs3scOF0tjC 2026-09-28 6/300 2026-09-29 14:13 by etmYJ6d2rquH
[博后之家] 售SCI一区T0P文章,我:8.O.55.1.O54,科目全,可伽急 +6 IDs3scOF0tjC 2026-09-28 7/350 2026-09-29 14:07 by etmYJ6d2rquH
[公派出国] 售一区SCI文章T0P,我:8O.551.O54,科目全,可十急 +4 IDs3scOF0tjC 2026-09-28 5/250 2026-09-29 13:50 by etmYJ6d2rquH
[考研] 售一区SCI文章T0P,我:8O.551.O54,科目全,可十急 +3 tqUTOxClQUMF 2026-09-28 3/150 2026-09-29 09:59 by JzYBbHIXWSrW
[考研] 售SCI一区文章,我:8.O.551.O.5.4,科目全,可伽急 +3 ZYXdhzDAy9ZX 2026-09-28 3/150 2026-09-29 06:42 by ZvyPK8n6Nfki
[找工作] 售SCI一区文章,我:8.O.551.O.5.4,科目全,可伽急 +3 ZYXdhzDAy9ZX 2026-09-28 3/150 2026-09-29 06:28 by ZvyPK8n6Nfki
[硕博家园] 售SCI一区T0P文章,我:8.O.55.1.O.54,科目齐全,可+急 +3 tqUTOxClQUMF 2026-09-28 3/150 2026-09-28 23:46 by b8fCuTHqckEt
[公派出国] 售SCI一区文章,我:8O5.5.1.O5.4,科目全,可伽急 +4 IDs3scOF0tjC 2026-09-28 4/200 2026-09-28 22:55 by ez6fGg9abYaj
[找工作] 售SCI文章,我:8O.5.5.1O.54,科目全,可十急 +3 IDs3scOF0tjC 2026-09-28 5/250 2026-09-28 22:32 by ez6fGg9abYaj
[考博] 售SCI文章,我:8O.5.5.1O.54,科目全,可十急 +3 IDs3scOF0tjC 2026-09-28 6/300 2026-09-28 22:15 by ez6fGg9abYaj
信息提示
请填处理意见