24小时热门版块排行榜    

查看: 2003  |  回复: 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的回帖

zeppe

金虫 (小有名气)

【答案】应助回帖

1.我发现如果输入文件(test.txt)中只加入第1,8,15,22行(对应ITEM: TIMESTEP),并在代码中加入下列代码行:      
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);
此行有问题,如果我注视掉将出现错误结果。
不知道为什么?
===
楼主你好,程序是要根据文本的格式作变化的,你改了格式之后应该尽量让程序不会出现误判的情况。
原来只有Frame一行是字符,其他都是要用的数字,要考虑的条件很少,所以可以那样写。
现在改了格式了,就要加限定条件,让计算机认准地方。
注意到 16000.0是夹在ITEM: TIMESTEP 和 Atoms 这两行之间的,出现了好几次,那么这个值在这个文本文件中如果一直不变,就可以用一个数值变量存储,不然就要用数组/vector存储。
假设这个16000.0是可能变化的,并且一直夹在ITEM: TIMESTEP 和 Atoms 这两行之间
那么可以这样读入:
CODE:
std::vector<double> vt;
bool bItem = false;
int nrow = 0;
while(std::getline(infile, line)
{
nrow += 1; //记录行号
// 其他代码
if (line == "ITEM: TIMESTEP")
{
     bItem = true; // turn on bItem
    nItem = nrow; //
}
if (bItem && nrow > nItem)
{
     if(line == "Atoms")
    {
          bItem = false;  // turn off bItem
    }
   else
   {
          std::istringstream iss1(line);
          double vab;
          iss1 >> vab;
         vt.push_back(vab);
   }
}
// 其他代码
}

以上没有测过,我下班了,如果有问题明天再说。

» 本帖已获得的红花(最新10朵)

16楼2013-06-03 18:22:02
已阅   回复此楼   关注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的回帖
信息提示
请填处理意见