0
我有一些數據從實驗記錄下來,保存爲二進制文件。記錄了許多電壓樣本,我告訴每個樣本是在0到0xFFFFFF範圍內的4字節無符號整數(無符號整數)。 因此,我試圖讀取C++中的二進制文件,執行將二進制數據轉換爲伏特的計算,並將這些值寫入.csv文件(從中可以將其導入到我的分析軟件中)。嘗試讀取4字節無符號整數的二進制文件並將其轉換爲伏特
問題: 我嘗試使用fread()將二進制獲取到名爲'buffer'的數組中。它編譯時不會給我一個錯誤,但數組的大小會隨着其原始大小的四倍而變化,並且程序本身會崩潰。它將相同的值重複寫入.csv文件。 我正確使用fread()嗎?
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <io.h>
#include <fstream>
#include <iostream>
#include <cstdio>
using namespace std;
int main() {
FILE * pFile;
int buffer[30000];
pFile = fopen ("00001001.e01", "rb");
fread(buffer, 4, 30000, pFile); // Copy the file into the buffer:
int buffsize = sizeof(buffer);
cout << buffsize; //How big is the buffer? It's 120000 now (error)
//Open .csv file
ofstream outFile;
outFile.open("test.csv");
/* Loop to calculate voltage V[i] to V[n]*/
int volts[30000];
for (int i=0; i < sizeof(buffer); i++)
{
volts[i] = 1.6 * (buffer[i] - 0x7FFFFF)/0x7FFFFF;
outFile << volts[i] << ";" << endl; /* To write each calculated value to the .csv file.*/
}; //Error - now writes 30000 values that are all same value - "817'
// Terminate
fclose (pFile);
free (buffer);
outFile.close();
return 0;
}
此外:你的程序很有可能崩潰,因爲你正在'buffer'上執行'free',這是一個棧變量。刪除「免費」的電話。另外,爲什麼你使用C運行時庫'fopen'和朋友輸入,而C++'ofstream'輸出?選擇C或C++並保持一致。 –
'buffer'的元素應該是'uint_least32_t'。 – Casey
@Casey:不,他們需要'uint32_t'; 「最少」不會這樣做,因爲我們從文件中讀取非常特定類型的二進制表示(可能是32位小端無符號整數)。 –