簡體   English   中英

將二進制序列化轉換為人類可讀的序列化

[英]Converting binary serialization to human-readable serialization

我正在將用於對結構進行二進制轉儲的程序轉換為文件,然后使用fread讀取該二進制結構。 我想將其轉換為創建和讀取人類可讀的數據文件,這當然意味着我需要格式化數據等。

在ascii中創建數據文件毫不費力。 我從使用fwrite切換到使用fprintf,並指定了以\\ n結尾的格式作為新行。

FPFPF = fopen( flightStr, "w+" );

    if (FPFPF != NULL)
    {
        for ( i = 0; i < FlightInfo[flightnum].endFrameIndex; i++)
        {
            FlightEntries[flightnum][i].local_z += DeltaAlt;

            //if (fwrite (&FlightEntries[flightnum][i], sizeof (FLIGHT_ENTRY_TYPE), 1, FPFPF) !=1)
            if (fprintf (FPFPF, "%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f\n",
                FlightEntries[flightnum][i].local_x,
                FlightEntries[flightnum][i].local_y,
                FlightEntries[flightnum][i].local_z,
                FlightEntries[flightnum][i].pitch,
                FlightEntries[flightnum][i].roll,
                FlightEntries[flightnum][i].heading,
                FlightEntries[flightnum][i].gearpos,
                FlightEntries[flightnum][i].flappos,
                FlightEntries[flightnum][i].speedbrakepos,
                FlightEntries[flightnum][i].canopypos,
                FlightEntries[flightnum][i].afterburnerOn,
                FlightEntries[flightnum][i].kias,
                FlightEntries[flightnum][i].time) !=1)
            {
                WE++;
            }
        }

        fclose( FPFPF );
    }

這工作得很好。 您可以看到舊的fwrite現在已被注釋掉。

我希望讀取文件同樣容易,但是似乎無法正常工作,而且我無法調試它,因為我在調試版本中使用Freetype發生了奇怪的內存泄漏,無法進入碼。 這是從文件讀取的代碼。

if (load)
        {
            for ( i = 0; i < MAX_FLIGHT_ENTRIES; i++)
            {               
                // If the file end is found before it should be, set values to defaults
                // and save the file
                if (feof(pFile))
                {
                    FlightInfo[fileIndex].endFrameIndex = i - 1;
                    break;
                }
                else
                {
                    //fread (&FlightEntries[fileIndex][i], sizeof (FLIGHT_ENTRY_TYPE), 1, pFile);

                    fscanf (pFile, "%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f\n",
                        &FlightEntries[fileIndex][i].local_x,
                        &FlightEntries[fileIndex][i].local_y,
                        &FlightEntries[fileIndex][i].local_z,
                        &FlightEntries[fileIndex][i].pitch,
                        &FlightEntries[fileIndex][i].roll,
                        &FlightEntries[fileIndex][i].heading,
                        &FlightEntries[fileIndex][i].gearpos,
                        &FlightEntries[fileIndex][i].flappos,
                        &FlightEntries[fileIndex][i].speedbrakepos,
                        &FlightEntries[fileIndex][i].canopypos,
                        &FlightEntries[fileIndex][i].afterburnerOn,
                        &FlightEntries[fileIndex][i].kias,
                        &FlightEntries[fileIndex][i].time);
                }
            }

            FlightInfo[fileIndex].endFrameIndex = i - 1;

        }

在打開pFile之前,還有一些其他檢查,如果我們要做的不只是查看文件是否存在,還要設置load是一個布爾值。 如果重要的話,FlightInfo結構的所有值都是float,除了local_x,local_y和local_z均為double之外。 這里有什么明顯不對的地方嗎? 它會編譯並無錯誤運行,直到調用此代碼塊,然后它才崩潰。

由於對可變參數的默認提升, fprintf傳遞float還是double float都沒有關系。

但是無論您傳遞float*還是double*對於fscanf非常重要:

有關標志,請參見http://man7.org/linux/man-pages/man3/scanf.3.html

以下類型修飾符可以出現在轉換規范中:

l表示轉換將是d,i,o,u,x,X或n之一,並且下一個指針是指向long int或unsigned long int(而不是int)的指針, 或者轉換將是e,f或g中的一個,下一個指針是指向double(而不是float)的指針 指定兩個l字符等效於L。如果與%c或%s一起使用,則相應的參數分別被視為指向寬字符或寬字符字符串的指針。

實際上,您應該閱讀整個手冊頁,還有其他有趣的陷阱。

fprintf一句,帶有浮點說明符的l修飾符對fprintf無效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM