在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例Qt 图形界面开发 → SEGY数据读取

SEGY数据读取

Qt 图形界面开发

下载此实例
  • 开发语言:C/C++
  • 实例大小:0.01M
  • 下载次数:24
  • 浏览次数:590
  • 发布时间:2020-01-28
  • 实例类别:Qt 图形界面开发
  • 发 布 人:yekong0414
  • 文件格式:.rar
  • 所需积分:4
 相关标签: 数据

实例介绍

【实例简介】QT语言读写segy.rar

所需文件为sgyio文件夹下的,deo.cpp和mainwindou.cpp下为如何使用进行读写的例子



功能:读写segy文件,可以是三维的,输入输出格式可以是ibm或pc

【实例截图】

from clipboard

【核心代码】

#include "sgyreader.h"

#include <qfile.h>
#include <iostream>
using namespace std;

SgyReader::SgyReader()
    : SgyIO(), m_sampleNum(0), m_sampleInt(0), m_isValid(false)
{
}

SgyReader::SgyReader(const QString &fileName)
    : SgyIO(), m_sampleNum(0), m_sampleInt(0), m_isValid(false)
{
    setFile(fileName);
}

SgyReader::~SgyReader()
{
}

/*this function comprises two parts. one is open the specified 
 * file,return ture if success, return false otherwise, the other
 * is verifing whether the file is sgy file, if yes,then get some 
 * vital information such as sample number, sample interval, samp-
 * le data format,etc,and set the m_valid true at the same time.
 * otherwise, return and set the m_valid false meanwhile .
 */
bool  SgyReader::setFile(const QString &fileName)
{
    //open file
    if(m_file == NULL)
    {
 m_file = new QFile(fileName);
 if(!m_file->open(IO_ReadOnly))
 {
     cout << "can not open the file : " << fileName<< endl;
     return false;
 }
    }else
    {
 if(m_file->isOpen())
     m_file->close();

 delete m_file;
 m_file = new QFile(fileName);


 if(!m_file->open(IO_ReadOnly))
 {
     cout << "can not open the file : " << fileName << endl;
     return false;
 }
    }

    //verifing file
    short sampFormat;
    m_file->at(3224);
    m_file->readBlock((char*)&sampFormat, sizeof(short));
    char *p = (char*)&sampFormat;
    if(p[0] == 0)
    {
 switch(p[1])
 {
     case 1:
  {
      setFormat(BigEndian | IBMFloat);
      m_isValid = true;
      break;
  }
     case 2:
  {
      setFormat(BigEndian | FourBytesInteger);
      m_isValid = true;
      break;
  }
     case 3:
  {
      setFormat(BigEndian | TwoBytesInteger);
      m_isValid = true;
      break;
  }
     case 5:
  {
      setFormat(BigEndian | IEEEFloat);
      m_isValid = true;
      break;
  }
     case 8:
  {
      setFormat(BigEndian | OneByteInteger);
      m_isValid = true;
      break;
  }
     default:
  {
      m_isValid = false;
      break;
  }
 }
    }else if(p[1] == 0)
    {
 switch(p[0])
 {
     case 1:
  {
      setFormat(LittleEndian | IBMFloat);
      m_isValid = true;
      break;
  }
     case 2:
  {
      setFormat(LittleEndian | FourBytesInteger);
      m_isValid = true;
      break;
  }
     case 3:
  {
      setFormat(LittleEndian | TwoBytesInteger);
      m_isValid =true;
      break;
  }
     case 5:
  {
      setFormat(LittleEndian | IEEEFloat);
      m_isValid = true;
      break;
  }
     case 8:
  {
      setFormat(LittleEndian | OneByteInteger);
      m_isValid = true;
      break;
  }
     default:
  {
      m_isValid = false;
      break;
  }
 }
    }else
    {
 m_format = 0;
 m_isValid = false;
    }

    //get sample number ,sample interval and trace number if m_isValid is true
    if(m_isValid)
    {
 m_file->at(3216);
        m_file->readBlock((char*)&m_sampleInt, sizeof(m_sampleInt));

 m_file->at(3220);
 m_file->readBlock((char*)&m_sampleNum, sizeof(m_sampleNum));

 if(m_needSwap)
 {
     swapBytes(&m_sampleInt, 2);
     swapBytes(&m_sampleNum, 2);
 }

 //int size_int = m_file->size();//must be qint64 .bug for the first time.
 Q_INT64 size = m_file->size();
 m_traceNum = (size - 3600) / (240 m_sampleNum * 4);

    }

    return true;
}

bool SgyReader::isValid() const
{
    return m_isValid;
}

short SgyReader::sampleNumber() const
{
    return m_sampleNum;
}

short SgyReader::sampleInterval() const
{
    return m_sampleInt;
}

Q_INT64 SgyReader::traceNumber() const
{
    return m_traceNum;
}

void SgyReader::readRollHeader(RollHeader &rollHeader) const
{
    m_file->at(0);
    m_file->readBlock((char*)&rollHeader, 3600);

    if(m_needSwap)
       swapRollHeader(rollHeader);
}

void SgyReader::readTraceHeader(TraceHeader &traceHeader, int seqNum) const
{
    int tSize = 0;
    int sampType =  m_format & 0x0000007c; // source file sample data format

    switch(sampType)
    {
 case TwoBytesInteger:
     {
  tSize = 2;
  break;
     }
 case OneByteInteger:
     {
  tSize = 1;
  break;
     }
 default:
     {
  tSize = 4;
  break;
     }
    }
    Q_INT64 nnn1=3600 ,nnn2=(seqNum - 1),nnn3=(240 m_sampleNum * tSize);
    Q_INT64 pos = nnn1 nnn2* nnn3;//here wo must use qint64 instead of int ,because of the support to large file .
    m_file->at(pos);
    m_file->readBlock((char*)&traceHeader, 240);

    if(m_needSwap)
 swapTraceHeader(traceHeader);
}


/*this function is used for reading trace data for type floating .
 *(i.e ieee or ibm). the pointer data points to the actual data, 
 *the n represents the size of the array , usually, which is the
 *number of the sample, seqNum represent which trace should be
 *read .
 *note : seqNum starts from 1.....N .
 */
void SgyReader::readTraceData(float *data, int n, int seqNum) const
{
    int dataFormat = sampleDataFormat();
    switch(dataFormat)
    {
 case IBMFloat:
     {
 Q_INT64  nnn1=3840,nnn2=(seqNum - 1) ,nnn3= (240 m_sampleNum * sizeof(float));
              Q_INT64 pos= nnn1 nnn2*nnn3;
//  Q_INT64 pos = 3840 (seqNum - 1) * (240 m_sampleNum * sizeof(float));
  m_file->at(pos);


  if(!m_needSwap && !m_needFloatConversion)
  {
      m_file->readBlock((char*)data, n * sizeof(float));
  }else
  {
      float *temp = new float[n];

      m_file->readBlock((char*)temp, n * sizeof(float));

      if(m_needSwap)
   swapTraceData(temp, n);

      if(m_needFloatConversion)
      {
   ibm2ieee((int*)temp, (int*)data, n);
   delete []temp;
   return;
      }

      memcpy(data, temp, n * sizeof(float));
      delete []temp;
  }

  break;
     } 
 case IEEEFloat:
     {
        Q_INT64  nnn11=3840,nnn22=(seqNum - 1) ,nnn33= (240 m_sampleNum * sizeof(float));
        Q_INT64 pos= nnn11 nnn22*nnn33;
  //Q_INT64 pos = 3840 (seqNum - 1) * (240 m_sampleNum * sizeof(float));
  m_file->at(pos);


  if(!m_needSwap && !m_needFloatConversion)
  {
      m_file->readBlock((char*)data, n * sizeof(float));
  }else
  {
      float *temp = new float[n];

      m_file->readBlock((char*)temp, n * sizeof(float));

      if(m_needSwap)
   swapTraceData(temp, n);

      if(m_needFloatConversion)
      {
   ieee2ibm((int*)temp, (int*)data, n);
   delete []temp;
   return;
      }

      memcpy(data, temp, n * sizeof(float));
      delete []temp;
  }

  break;
     }
 case FourBytesInteger:
     {
 Q_INT64  nnn111=3840,nnn222=(seqNum - 1) ,nnn333= (240 m_sampleNum * sizeof(float));
              Q_INT64 pos= nnn111 nnn222*nnn333;
  //Q_INT64 pos = 3840 ( seqNum - 1) * (240 m_sampleNum * sizeof(int));
  m_file->at(pos);


  int *temp = new int[n];
  m_file->readBlock((char*)temp, n * sizeof(int));

  if(m_needSwap)
      swapTraceData(temp, n);

  for(int i = 0; i < n; i )
      data[i] = temp[i];

  delete []temp;


  break;
     }
 case TwoBytesInteger:
     {
  Q_INT64  n1=3840,n2=(seqNum - 1) ,n3= (240 m_sampleNum * sizeof(float));
  Q_INT64 pos= n1 n2*n3;
//Q_INT64 pos = 3840 (seqNum - 1) * (240 m_sampleNum * sizeof(short));
  m_file->at(pos);

  short *temp = new short[n];
  m_file->readBlock((char*)temp, n * sizeof(short));
  if(m_needSwap)
      swapTraceData(temp, n);

  for(int i = 0; i < n; i )
      data[i] = temp[i];

  delete []temp;

  break;
     }
 case OneByteInteger:
     {
Q_INT64  n_1=3840,n_2=(seqNum - 1) ,n_3= (240 m_sampleNum * sizeof(float));
Q_INT64 pos=n_1 n_2*n_3; 
 // Q_INT64 pos = 3840 (seqNum - 1) * (240 m_sampleNum * sizeof(char));
  m_file->at(pos);

  char *temp = new char[n];
  m_file->readBlock(temp, n * sizeof(char));

  for(int i = 0; i < n; i )
      data[i] = temp[i];

  delete []temp;

  break;
     }
 default:
     {
  break;
     }
    }/* end switch */

}

标签: 数据

实例下载地址

SEGY数据读取

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警