24小时热门版块排行榜    

查看: 2586  |  回复: 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的回帖
回帖置顶 ( 共有1个 )

zeppe

金虫 (小有名气)

【答案】应助回帖

★ ★ ★ ★ ★ ★ ★ ★ ★ ★
mljphy: 回帖置顶 2013-06-04 15:40:50
mljphy: 金币+10, ★★★★★最佳答案, zeppe编程水平令人羡慕。以后多想你学习。 2013-06-04 15:42:17
楼主你好,请试用下面这些可以来实现读取17楼提供的文件,假设存为"test_new.txt"
在我电脑上是"D:\\Skydrive\\MyCode\\cpp\\TreatString\\TreatString\\src\\test_new.txt"
请根据你自己的情况修改文件路径和文件名。
另外,如果你方便公开文件的话,最好是直接在附件或网盘给出你的文件,这样不用老改。
CODE:
#include <iostream>
#include <sstream>
#include <fstream>
#include <vector>
#include <cassert>

int main(void)
{
        // path of the input file ###### please edit this line according to your real path
        std::string filename = "D:\\Skydrive\\MyCode\\cpp\\TreatString\\TreatString\\src\\test_new.txt";
        std::ifstream infile(filename);

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

        // variables for the timesteps
        std::vector<double> timesteps;
        bool bTimeStep = false;
        int nTimeStep = 0;

        // variables for the atoms
        std::vector<int> atoms;  
        bool bAtoms = false;
        int nAtoms = 0;

        // variables for the coordinates
        std::vector<double> coordinates;
        bool bCoordinates = false;
        int nCoordinates = 0;

        // variables for the frames
        std::vector<double> frames;   
        bool bFrame = false;
        int nFrame = 0;

        std::string line;  // string that stores each line read in
        int nLine = 0;

        // read file line by line
        while(std::getline(infile, line))
        {
                nLine += 1;
                // read in TimeStep
                if(line == "ITEM: TIMESTEP"){
                        bTimeStep = true;
                        nTimeStep = nLine;
                }
                if(nLine > nTimeStep && bTimeStep){
                        if(line == "Atoms"){
                                bTimeStep = false;
                        }
                        else {
                                double val = std::numeric_limits<double>::quiet_NaN();
                                std::istringstream iss(line);
                                iss >> val;
                                timesteps.push_back(val);
                        }
                }
                // read in Atoms
                if(line == "Atoms"){
                        bAtoms = true;
                        nAtoms = nLine;
                }
                if(nLine > nAtoms && bAtoms){
                        if(line == "Coordinates"){
                                bAtoms = false;
                        }
                        else {
                                int val = 0;
                                std::istringstream iss(line);
                                iss >> val;
                                atoms.push_back(val);
                        }
                }
                //read in coordinates
                if(line == "Coordinates"){
                        bCoordinates = true;
                        nCoordinates = nLine;
                }
                if(nLine > nCoordinates && bCoordinates){
                        if(line == "Frame"){
                                bCoordinates = false;
                        }
                        else {
                                double val1, val2;
                                std::istringstream iss(line);
                                iss >> val1 >> val2;
                                coordinates.push_back(val1);
                                coordinates.push_back(val2);
                        }
                }
                //read in frame
                if(line == "Frame"){
                        bFrame = true;
                        nFrame = nLine;
                }
                if(nLine > nFrame && bFrame){
                        // ############ should be modified when file changes
                        if(line == "......共171行......"){
                                bFrame = false;
                        }
                        else if(line == "ITEM: TIMESTEP") {
                                bFrame = false;
                        }
                        else {
                                double val1, val2, val3, val4, val5;
                                std::istringstream iss(line);
                                iss >> val1 >> val2 >> val3 >> val4 >> val5;
                                frames.push_back(val1);
                                frames.push_back(val2);
                                frames.push_back(val3);
                                frames.push_back(val4);
                                frames.push_back(val5);
                        }
                }
        }

        // check if successfully read
        if(timesteps.empty()){
                std::cerr << "ERROR: failed to read timesteps." << std::endl;
        }
        if(atoms.empty()){
                std::cerr << "ERROR: failed to read atoms." << std::endl;
        }
        if(coordinates.empty()){
                std::cerr << "ERROR: failed to read coordinates." << std::endl;
        }
        if(frames.empty()){
                std::cerr << "ERROR: failed to read frames." << std::endl;
        }
        // ############ should be modified when file changes
        assert(timesteps.size() == atoms.size());
        assert(timesteps.size()*6 == coordinates.size());
        assert(timesteps.size()*5*4 == frames.size());

        //output values
        for(size_t i = 0; i < timesteps.size(); ++i)
        {
                std::cout << "TimeSteps" << std::endl;
                std::cout << timesteps[i] << std::endl;

                std::cout << "Atoms" << std::endl;
                std::cout << atoms[i] << std::endl;

                std::cout << "Coordinates" << std::endl;
                for(size_t j = 0; j < 3; ++j)
                {
                        for(size_t k = 0; k < 2; ++k)
                        {
                                std::cout<<coordinates[6*i + j*2 + k] << "\t";
                        }
                        std::cout << std::endl;
                }

                std::cout << "Frames" << std::endl;
                // ############# should be modified when file changes
                for(size_t m = 0; m < 4; ++m)
                {
                        for(size_t n = 0; n < 5; ++n)
                        {
                                std::cout << frames[20*i + m*5 + n] << "\t";
                        }
                        std::cout<< std::endl;
                }
        }

        return 0;
}

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

18楼2013-06-04 11:04:19
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
普通回帖

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的回帖

zhanglinfeng

新虫 (小有名气)

【答案】应助回帖

怎么会了?你把你的代码贴出来看看!
5楼2013-06-02 21:26:58
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

mljphy

铁虫 (正式写手)

引用回帖:
5楼: Originally posted by zhanglinfeng at 2013-06-02 21:26:58
怎么会了?你把你的代码贴出来看看!

#include<iostream>
#include<fstream>
#include<string>
#include <stdio.h>

using namespace std;
using std::cout ;

int main()
{
  const char *filename  = "G:cpp/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 k1 = 0 ; k1 !=3 ; k++)  //为了测试正确性
for (int n = 0 ; n != 3 ; n++)
{
    cout << a1[k1][n] << "\t" << a2[k1][n] << "\t" << a3[k1][n] << std::endl     ;
}

return 0 ;

}

我的用的代码。
我用VC 6.0.
一切都会慢慢好起来。
6楼2013-06-02 21:37:24
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zhanglinfeng

新虫 (小有名气)

【答案】应助回帖

你的filename不应该这么写吧?windows里面至少应该是双斜杠吧?这个不能通过编译,文件的绝对路径要写对。我电脑上测试是对的
7楼2013-06-02 22:27:40
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

mljphy

铁虫 (正式写手)

引用回帖:
7楼: Originally posted by zhanglinfeng at 2013-06-02 22:27:40
你的filename不应该这么写吧?windows里面至少应该是双斜杠吧?这个不能通过编译,文件的绝对路径要写对。我电脑上测试是对的

实际上这个问题我也考虑了,多次改过
  const char *filename="E:\\Mycodes\\CPP\\test.txt" ;
这种方式至少能编译成功。但输出的结果却不对。所有数据都为零,好像没有读入一样。

代码如下:
#include<iostream>
#include<fstream>
#include<string>
#include <stdio.h>

using namespace std;
using std::cout ;

int main()
{
  const char *filename="E:\\Mycodes\\CPP\\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 k1 = 0 ; k1 !=3 ; ++k1)  //为了测试正确性
for (int n1 = 0 ; n1 != 3 ; ++n1)
{
    cout << a1[k1][n1] << "\t" << a2[k1][n1] << "\t" << a3[k1][n1] << std::endl     ;
}

return 0 ;

}
一切都会慢慢好起来。
8楼2013-06-03 00:49:58
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zhanglinfeng

新虫 (小有名气)

【答案】应助回帖

首先你那个文件里必须有你的数据,其次中间的那句using std::cout 可以不用要了,已经有std命名空间了
其余的和我写的一样,应该没问题,你在试试。
9楼2013-06-03 08:06:02
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

mljphy

铁虫 (正式写手)

引用回帖:
9楼: Originally posted by zhanglinfeng at 2013-06-03 08:06:02
首先你那个文件里必须有你的数据,其次中间的那句using std::cout 可以不用要了,已经有std命名空间了
其余的和我写的一样,应该没问题,你在试试。

还是不行,各种方法都用过了。我发现*filename 根本就没有只想所需要的文件,各种方式都试过了,总是没有读文件一样。
一切都会慢慢好起来。
10楼2013-06-03 10:30:31
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 mljphy 的主题更新
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[基金申请] 欢迎发来filecode的Mz6后的代码验证其规律 +40 医学老男孩 2026-08-13 92/4600 2026-08-18 09:48 by 医学老男孩
[基金申请] 时间戳变了,能看出什么问题? +4 基诺咪客 2026-08-17 5/250 2026-08-18 08:03 by 基诺咪客
[基金申请] 93BebMhtakh前后11位开头都是大写 +4 且听虎啸 2026-08-17 5/250 2026-08-18 00:49 by 蔡棒棒菂
[基金申请] 感觉是下周放榜了 +6 angus9576 2026-08-17 11/550 2026-08-17 23:57 by angus9576
[基金申请] filecode=后面第一个是大写字母 +8 wangze12014 2026-08-14 10/500 2026-08-17 17:05 by xter9665
[基金申请] 哪位老哥知道今年的国自然具体哪一天放榜? +12 Ldrop2023 2026-08-13 15/750 2026-08-17 15:02 by 小豌豆_发芽
[基金申请] 今天系统多次维护,明天很可能放榜! +8 zju2000 2026-08-16 9/450 2026-08-17 12:20 by lmz0216
[基金申请] 时间戳又变了8-15 +13 archvillain 2026-08-15 25/1250 2026-08-16 20:13 by zhaosm1982
[基金申请] 2027广东省杰青 +3 奶牛小黑 2026-08-15 6/300 2026-08-16 20:07 by 奶牛小黑
[基金申请] 快农历七夕节了,轻松一下,男人悄悄话,女施主请不要进来。 +3 Tide man 2026-08-14 3/150 2026-08-16 17:47 by jurkat.1640
[基金申请] 咱们一起用铁证分析2026国家社科基金中标与否 +7 启萌科技 2026-08-12 26/1300 2026-08-16 12:35 by 启萌科技
[精细化工] 招聘 金属平磨液,抛光液研发工程师 +3 小天0311 2026-08-14 3/150 2026-08-16 07:31 by H9PLUS
[基金申请] 各位道友,我要去昆明玩几天,回来见。 +7 Tide man 2026-08-14 8/400 2026-08-15 01:11 by arzu_hma
[基金申请] 是这周出结果还是下周出结果? +4 yuleib84 2026-08-11 4/200 2026-08-14 23:05 by lfy8008
[硕博家园] 读博的好处 +4 lnee 2026-08-11 4/200 2026-08-14 10:20 by ahsoarli
[基金申请] 重要来源:本周末出结果 +10 瞬息宇宙 2026-08-12 10/500 2026-08-13 15:46 by likettle
[基金申请] 不应该看fileCode +7 且听虎啸 2026-08-12 9/450 2026-08-13 14:27 by flydreamws
[基金申请] 结合人工智能,周易传统文化,filecode打分制来了,3分以上希望很大。 +3 Tide man 2026-08-12 4/200 2026-08-13 08:35 by ZJTJZ
[基金申请] 2019年青年基金涵评意见,大家看看几个A,几个B? +11 Tide man 2026-08-11 11/550 2026-08-13 07:35 by 撸猫猫
[基金申请] 什么时候出结果,有咨询渠道??? +3 Tide man 2026-08-11 3/150 2026-08-11 17:54 by kudofaye
信息提示
请填处理意见