Russian Qt Forum

Qt => Вопросы новичков => Тема начата: demaker от Июль 29, 2013, 14:58



Название: работа с файлом
Отправлено: demaker от Июль 29, 2013, 14:58
работаю с файлом

Код
C++ (Qt)
double* CCOMTRADE::getAnalogDataVectorBIN(QString path, int channel)
{
   qDebug()<<"getAnalogDataVectorBIN";
 
   QFile pFile(path);
   char* byteData;
 
   int EntrySize = 0;
   int nac = DynamicCfg->NumOfAnalogChannels;
   int ndc = DynamicCfg->NumOfDigitalChannels;
   int Bunches = ndc >> 4;
 
   Bunches = (ndc == (Bunches * 16)) ? Bunches : Bunches + 1;
   EntrySize = (((nac + Bunches) * 2) + 8);
 
   if(pFile.exists())
   {
       if(!pFile.open(QIODevice::ReadOnly))
       {
           qDebug()<<"file not open";
           return NULL;
       }
 
       AnalogDataVector  = new double [DynamicCfg->NumSamples + 1];
       if(AnalogDataVector == NULL) return NULL;
 
       byteData = new char[(DynamicCfg->NumSamples)*EntrySize];
       if(byteData == NULL) return NULL;
 
       qint64 readNum = pFile.read(byteData,(DynamicCfg->NumSamples)*EntrySize);
       if(readNum == (DynamicCfg->NumSamples + 1)*EntrySize)return NULL;
       qDebug()<<"readNum = "<< readNum;
 
       short int tmp = 0;
       int ad_idx = 0;
       for (int i = 0; i<DynamicCfg->NumSamples; i++)
       {
           ad_idx = EntrySize*(i) + 8 + (channel * 2);
           tmp = byteData[ad_idx + 1] & 0x00FF;
           tmp <<= 8;
           tmp |= byteData[ad_idx + 0] & 0x00FF;
           AnalogDataVector[i] = (double)tmp;
       }
 
       pFile.close();
       qDebug()<<"return AnalogVector";
       return  AnalogDataVector;
   }
   qDebug() <<"File not exists";
   return NULL;
}
 

Затем выше приведенный метод используется в конструкторе
Код
C++ (Qt)
Plot::Plot(QString nameConfFile, comtrade_curve_type_t type,int number_chanel,QWidget *parent)
   : QwtPlot(parent)
{      
   ct = new CCOMTRADE;
   ct->LoadConfig(nameConfFile);
 
   int l = nameConfFile.length();
   QString fn_dat = nameConfFile.remove(l-4,4);
 
   list_simple_markers.clear();
   list_delete_markers.clear();
 
   if(type == ANALOG_TYPE)
   {
       data = new QwtPointArrayData(ct->getTimeDataVector(fn_dat+".DAT"),
                                    ct->getAnalogDataVector(fn_dat+".DAT", number_chanel),
                                    ct->DynamicCfg->NumSamples);
 
    ...
   }
 
Работает норм.
Затем по щелчку кнопки графики должны синхронизироваться
Код
C++ (Qt)
double* Plot::getSynchroAnalogDataVector(synchro_time*st)
{
   SynchroAnalogDataVector = new double[(int)((st->t_z_head + st->t_length + st->t_z_tail)/200) + 1];
 
   int j = 0;
 
   for(int i = 0; i<(int)(st->t_z_head/200) + 1; i++)
   {
       SynchroAnalogDataVector[i] = (double)(0);
   }
 
   for(int i = (int)(st->t_z_head/200) + 1; i<(int)(( st->t_z_head + st->t_length)/200) + 1; i++)
   {
       int l = s.length();
       QString fn_dat = s.remove(l-4,4);
       SynchroAnalogDataVector[i] = (double)(1);
       //SynchroAnalogDataVector[i] =
       qDebug()<<"ct->getAnalogDataVector =  "<<*(ct->getAnalogDataVector(fn_dat+".DAT",n) + j);//??????????????????????????
       j++;
       qDebug()<<"SynchroAnalogDataVector ="<<SynchroAnalogDataVector[i];
   }
 
   for(int i = (int)((st->t_z_head + st->t_length)/200) + 1; i<(int)((st->t_z_head + st->t_length + st->t_z_tail)/200) + 1; i++)
   {
       SynchroAnalogDataVector[i] = (double)(0);
   }
 
   return SynchroAnalogDataVector;
}
 

Но в getAnalogDataVector(fn_dat+".DAT",n) программа заходит только один раз,
а потом во второй раз вываливается
типа срабатывает if(pFile.exists()),
но файл то есть и существует.

Подскажите, что не правильно??? Спасибо!


Название: Re: работа с файлом
Отправлено: gil9red от Июль 29, 2013, 15:08
работаю с файлом

Код
C++ (Qt)
double* CCOMTRADE::getAnalogDataVectorBIN(QString path, int channel)
{
   qDebug()<<"getAnalogDataVectorBIN";
 
   QFile pFile(path);
   char* byteData;
 
   int EntrySize = 0;
   int nac = DynamicCfg->NumOfAnalogChannels;
   int ndc = DynamicCfg->NumOfDigitalChannels;
   int Bunches = ndc >> 4;
 
   Bunches = (ndc == (Bunches * 16)) ? Bunches : Bunches + 1;
   EntrySize = (((nac + Bunches) * 2) + 8);
 
   if(pFile.exists())
   {
       if(!pFile.open(QIODevice::ReadOnly))
       {
           qDebug()<<"file not open";
           return NULL;
       }
 
       AnalogDataVector  = new double [DynamicCfg->NumSamples + 1];
       if(AnalogDataVector == NULL) return NULL;
 
       byteData = new char[(DynamicCfg->NumSamples)*EntrySize];
       if(byteData == NULL) return NULL;
 
       qint64 readNum = pFile.read(byteData,(DynamicCfg->NumSamples)*EntrySize);
       if(readNum == (DynamicCfg->NumSamples + 1)*EntrySize)return NULL;
       qDebug()<<"readNum = "<< readNum;
 
       short int tmp = 0;
       int ad_idx = 0;
       for (int i = 0; i<DynamicCfg->NumSamples; i++)
       {
           ad_idx = EntrySize*(i) + 8 + (channel * 2);
           tmp = byteData[ad_idx + 1] & 0x00FF;
           tmp <<= 8;
           tmp |= byteData[ad_idx + 0] & 0x00FF;
           AnalogDataVector[i] = (double)tmp;
       }
 
       pFile.close();
       qDebug()<<"return AnalogVector";
       return  AnalogDataVector;
   }
   qDebug() <<"File not exists";
   return NULL;
}
 

Ну ладно, согласен, работаете :)
А в чем проблема или вопрос-то? :D


Название: Re: работа с файлом
Отправлено: demaker от Июль 29, 2013, 15:52
Разобрался
Код
C++ (Qt)
double* Plot::getSynchroTimeVector(synchro_time*st)
{    
...
   int l = s.length();
   QString fn_dat = s.remove(l-4,4);
   double *getAnalVec = ct->getAnalogDataVector(fn_dat+".DAT",n);
 
   for(int i = (int)(st->t_z_head/200) + 1; i<(int)(( st->t_z_head + st->t_length)/200) + 1; i++)
   {      
       SynchroAnalogDataVector[i] = *(getAnalVec + j);
       //SynchroAnalogDataVector[i] =
       qDebug()<<"ct->getAnalogDataVector =  "<<*(getAnalVec + j);//??????????????????????????
       j++;
       qDebug()<<"SynchroAnalogDataVector ="<<SynchroAnalogDataVector[i];
   }
...
}
[code]
[/code]