程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 使用C++讀寫TDM以及TDMS文件

使用C++讀寫TDM以及TDMS文件

編輯:關於C語言

       TDM和TDMS是一種NI的數據存儲文件格式,兼顧速度、邏輯組織。對於此格式數據文件,NI提供的第三方庫使用也很便捷。關於TDM和TDMS的更多敘述,請自行google、百度,或者去官網了解。這裡主要給出第三方庫的簡單使用,及經過自己的測試,得到的關於TDM和TDMS格式的效率結論。

       NI提供的第三方庫使用時配置環境十分簡單,把頭文件、動態庫布置好就行,讀寫文件的例子如下從官網下載第三方庫帶的也有例子):

//寫TDM/TDMS格式文件
int CTDMSTestDlg::WriteDDCFile(const char* filePath, int channelNum, int dataLen, const char* fileType /* = "TDM" */)
{
    DWORD begin = ::GetTickCount();
    DDCFileHandle testFile;
    DDC_CreateFile(filePath, fileType, "", "", "", "", &testFile);//創建指定格式的文件
    DDCChannelGroupHandle group01;
    DDC_AddChannelGroup(testFile, "group01", "", &group01);//增加一個通道組
    DDCChannelHandle* channels = new DDCChannelHandle[channelNum];
    double* channelData = CreateRandomData(dataLen);
    for (int i = 0; i < channelNum; i++)
    {
        char channelIdx[20];
        itoa(i, channelIdx, 10);
        DDC_AddChannel(group01, DDC_Double, channelIdx, "", "", &channels[i]);//增加一個通道,注意每次增加通道時,第三個參數的值要不一樣,否則會覆蓋
        DDC_SetDataValues(channels[i], channelData, dataLen);                   //為新增的通道設置數據
    }
    DDC_SaveFile(testFile);
    DWORD end = ::GetTickCount();
    DDC_CloseFile(testFile);
    delete[] channels;
    delete[] channelData;
    return end - begin;
}
//讀TDM/TDMS格式文件
int CTDMSTestDlg::ReadDDCFile(const char* filePath, const char* fileType/* = "TDM"*/)
{
    DWORD begin = ::GetTickCount();
    DDCFileHandle ddcFile;
    DDC_OpenFile(filePath, fileType, &ddcFile);//打開文件
    unsigned int groupNum = 0;
    DDC_GetNumChannelGroups(ddcFile, &groupNum);//獲取通道組的數目
    DDCChannelGroupHandle* groups = new DDCChannelGroupHandle[groupNum];
    for (int i = 0; i < groupNum; i++)
    {
        unsigned int channelNum = 0;
        DDC_GetNumChannels(groups[i], &channelNum);//獲取通道的數目
        DDCChannelHandle* channels = new DDCChannelHandle[channelNum];
        for (int j = 0; j < channelNum; j++)
        {
            unsigned __int64 dataLen = 0;
            DDC_GetNumDataValues(channels[j], &dataLen);//獲取數據長度
            double* data = new double[dataLen];
            DDC_GetDataValuesDouble(channels[j], 0, dataLen, data);//獲取double類型數據
            for (int k = 0; k < dataLen; k++)
            {
                data[k];
            }
        }
        delete[] groups;
        groups = NULL;
    }
    DWORD end = ::GetTickCount();
    DDC_CloseFile(ddcFile);
    delete[] groups;
    return end - begin;
}

       可以看出,讀寫TDM和TDMS文件是非常方便的。

       但是TDM和TDMS格式有什麼區別呢?查過很多資料,最直接的最表象的區別就是,TDM有個XML頭,其他數據用二進制保存,而TDMS的索引啊數據啊都是二進制文件。看官網的介紹,我一直以為TDMS格式是比較提倡的。後來做實驗發現好像不是這麼回事,我得到的結論如下不局限於兩者的區別,還包括別的結論,另外也不保證一定對,但是可以作為參考,大家相互討論):

       1、在通道數和每個通道的數據長度相同時,TDM和TDMS格式產生的文件是差不多大小的;

       2、在通道數和每個通道的數據長度相同時,TDM和TDMS格式寫入數據時,TDMS格式寫數據總是比TDM格式花費的時間多將近一倍,讀取數據的時間都差不多兩者都有索引,在多次讀取數據時,花費的時間會比第一次花費的時間少,不過TDMS格式在多次訪問後的讀取時間始終比TDM格式的要多一點點);

       3、通道數目增加到10000這個級別的時候,寫數據花費的時間明顯增加很多,但是數據長度的增加和寫數據所花費的時間基本呈線性比例;

       4、注意寫入數據時要留足空間!這個第三方庫產生的中間文件比最終的數據文件大小還要大很多,比如12G左右的數據文件可能需要至少32G以上的空間。不過如果數據量不大的話,比如128個通道,數據長度為102400,最終數據大小為100M,不算很大,中間文件需要的空間也就不是很大,無需擔心了。

       代碼自行下載,使用VS2008。http://down.51cto.com/data/919272 或者 http://pan.baidu.com/share/link?shareid=112939018&uk=1007352492



  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved