![](/img/trans.png)
[英]puzzle - printing time in human-readable form in C; ctime, asctime
[英]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.