我有一個我正在嘗試撰寫的應用程式,它將獲取一個數字表(由用戶生成)并將該表寫入磁盤上的檔案。該檔案隨后將通過 USB 傳輸到 Arduino AVR 設備的 EEPROM。我希望將此資訊保存在磁盤上的格式是 4 位元組 Little Endian,即原始十六進制資料。我在下面的代碼中名為“tbl1Array[]”的表陣列已被轉換為雙精度數。下面是我現在擁有的雙層代碼片段,在一些陣列準備代碼之后。檔案打開/關閉作業正常,事實上,資料確實被傳輸到檔案中,但格式不是我想要的。
ofstream fileToOutput("318file.bin");
for (int i=0; i<41; i )
{
fileToOutput << tbl1Array[i];
}
fileToOutput.close();
問題是寫入檔案的內容是十進制值的十六進制 ASCII 表示。不是我想要的!我不知道我需要做什么才能將我的陣列作為一個漂亮的整潔的 4 位元組 Little Endian 單詞串聯串列,用于我的雙打,以后可以從 Arduino 代碼中讀取。我有一種使用 AVRDUDE(經過測驗和確認)將檔案傳輸到 Arduino 的作業方法,所以我唯一真正的問題是將我的應用程式陣列中的這些雙精度數轉換為磁盤上的 4 位元組 IEEE754。任何指導將不勝感激。問候 - 馬克
uj5u.com熱心網友回復:
在文本流中,換行符被翻譯。一些作業系統翻譯為
\r\n. 二進制流保持原樣。無論您如何打開流 - 二進制或文本:
一種。當您使用插入/提取運算子時,資料將被寫入text。假設
0x01是一位元組整數,1將寫入 ASCII(即0x31)。灣。如果您使用該
ostream::write方法,則寫入實際位元組;沒有翻譯發生。假設0x01是一位元組整數,0x01將被寫入。如果要寫入實際位元組,請以二進制模式打開流并使用
ostream::write:ofstream os{ "out.bin", ios::binary }; if (!os) return -1; double d = 1.234567; os.write((const char*)&d, sizeof d);如果要將實際位元組寫為字串,請以文本模式打開流并使用插入運算子:
ofstream os{ "out.txt" }; if (!os) return -1; double d = 1.234567; static_assert(sizeof(double) == sizeof(long long)); os << hex << *reinterpret_cast<long long*>(&d);如果你想寫一個double 作為 string,使用最大精度使用:
os << setprecision(numeric_limits<double>::max_digits10) << d;不要在同一個流上使用已翻譯和未翻譯的方法。
我不知道上述所有示例是否都適用于 Arduino 編譯器。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/446354.html
下一篇:如何讓它在同一行列印輸出?
