none
C語言存的二進制結構檔轉換成vb.net的問題... RRS feed

  • 問題

  • Hi, 不好意思
    小弟在六七年前曾使用以C為Based的LabWindows/CVI 來寫程式
    多年之後,後續開發的應用程式都改為VB.NET了, 但最近客戶提了一個需求,
    希望能夠將以前用CVI所存的紀錄檔Dumping成文字檔, 但因為以前CVI的存檔是使用結構化存檔成二進制檔案的,
    小弟有試著在Vb.net環境建立一個相同內容屬性的結構來配, 再用FiileOpen / FileGet 去讀回,
    但讀出的值都怪怪的,似乎是不能用這指令來讀,所以只好來這兒請教各位了,
    不知有沒有什麼方式可以在vb.net 正確的讀出呢?

    先謝謝各位了!

    CVI平台所儲存的檔案範本存在以下位置,供大家參考:
    http://dl.dropbox.com/u/3443509/resumefiles.err

    以下為小弟之前在 CVI平台所使用的結構宣告、讀寫使用指令

    //寫入結構到檔案FILE *errorfile;   
    errorfile = fopen (error_file, "wb");
    fwrite(&erResume,sizeof(erResume),1,errorfile);  	
    fclose(errorfile);  
    
    //從檔案順序讀取結構中每筆資料errorfile=fopen(view_load_file,"rb");    
    while(fread(&erResume,sizeof(erResume),1,errorfile)==1)
    	//Reading contents
    fclose(errorfile);
    
    //以下為原始結構定義內容
    struct erResume
    {
    		 int whereCall;
    		 char startTimeStr[35];
    		 char endTimeStr[35];
    		 int errorCode;
    		 char errorMessage[100];
    		 int  stepCode;  
    };

    小弟有試著寫以下方式讀回:

    '引用
    Imports System.IO.Ports
    Imports System.IO
    Imports System.Text
    
    '檔案讀寫副程式
    Function rw330resume(ByVal sw As Short, ByVal fName As String) As Boolean
            Dim freeNum As Short = FreeFile() '取得可用檔案編號
            Select Case sw
                Case Data.LoadFile
                    Try
                        FileOpen(freeNum, fName, OpenMode.Binary, OpenAccess.ReadWrite, OpenShare.Shared, Len(k330resume)) '開啟檔案
                        FileGet(freeNum, k330resume, -1)
    
                        FileClose(freeNum)
                    Catch ex As Exception
                         MsgBox(ex.ToString)
                        Return False
                    End Try
                Case Data.SaveFile
                    Try
                        FileOpen(freeNum, fName, OpenMode.Binary, OpenAccess.ReadWrite, OpenShare.Shared, Len(k330resume)) '開啟檔案
                        FilePut(freeNum, k330resume, 1)
                        FileClose(freeNum)
                    Catch ex As Exception
                           Return False
                    End Try
            End Select
    
            Return True
    
    End Function
    
    
    '陣列宣告
    Public k330resume As _k330resume
    Structure _k330resume
            Dim whereCall As Integer
            Dim errorCode As Integer
            Dim stepCode As Integer
            <VBFixedArray(35)> Dim startTimeStr() As Char        
    	<VBFixedArray(35)> Dim endTimeStr() As Char
            <VBFixedArray(100)> Dim errorMessage() As Char
    End Structure 


    • 已編輯 a- Nick - 2012年3月11日 下午 03:01 編排有異常
    • 已移動 璉璉Moderator 2012年3月17日 上午 10:06 (從:Visual Studio一般討論區(General))
    2012年3月11日 下午 02:56

解答

  • VB.NET 問題為啥貼在這個版?

    參考這篇:

    .Net framework 讀取結構作法 (VBNET)


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年3月12日 下午 12:08

所有回覆