を使用してバイナリファイルに書き込む際に、一貫した「アクセス違反の読み取り場所」で、一部の入力データのFFTを取得するコードを修正しようとしています。変換はすべてうまくいく。fstream
FFT.exeで0x68d0ca24(msvcr100d.dll)で未処理の例外:0xc0000005で:アクセス違反が場所0x00161000を読んで私は私が得るその時点でバイナリファイルに変換する書き込みをしようとすると、私の問題が発生します。
私がコンパイルしてプログラムを実行するたびに、これは奇妙なことです。 3回ごとに正常に実行され、データがファイルに保存されます。
#include <iostream>
#include <fstream>
#include <cmath>
#include <cstdlib>
#include "dft/FFT.h"
#include "ffft/FFTReal.h"
int main()
{
using namespace std;
const char* dataFile = "C:/users/gad18/documents/temp/testData.dat";
const char* transformFile = "C:/users/gad18/documents/temp/DFTtestOutput.dat";
int length;
off_t size;
fstream inFile;
inFile.open(dataFile, ios_base::in | ios_base::binary);
if (! inFile.is_open())
{
cout << "Error opening " << dataFile << " for reading." << endl;
cout << "Terminating process." << endl;
cin.get();
exit(EXIT_FAILURE);
}
cout << "Reading from " << dataFile << endl;
inFile.seekg(0, ios_base::end);
size = static_cast <off_t> (inFile.tellg());
inFile.seekg(0, ios_base::beg);
length = size/sizeof(float);
float* buffer = new float[ length ];
float* F = new float [length ];
inFile.read((char*) buffer, length * sizeof(float));
inFile.close();
cout << size << " bytes read in." << endl;
cout << length << " float elements read into memory." << endl;
cout << "Press return key to creat DFT object..." << endl;
cin.sync();
cin.get();
cout << "Creating DFT object of length " << length << " points." << endl;
dft::FFT dft_object(length);
ffft::FFTReal<float> ffft_object(length);
int bits_out = dft_object.get_bits();
cout << "Successfully created DFT object with " << bits_out << " bit depth." << endl;
cout << "Press return key to attempt fast Fourier transform of data..." << endl;
cin.sync();
cin.get();
dft_object.compute_FFT(F, buffer);
cout << "Press return key to save transform data..." << endl;
cin.sync();
cin.get();
fstream outFile;
outFile.open(transformFile, ios_base::out | ios_base::trunc | ios_base::binary);
if (! outFile.is_open())
{
cout << "Error opening " << dataFile << " for writing." << endl;
cout << "Terminating process." << endl;
cin.get();
exit(EXIT_FAILURE);
}
else
{
outFile.write((char*) &F, length * sizeof(float));
size = outFile.tellg();
cout << "Wrote " << size << " bytes to " << transformFile << endl;
outFile.close();
}
delete [] buffer;
delete [] F;
cout << "Press return key to continue...";
cin.sync();
cin.get();
return 0;
} // int main()
私の謝罪これが(最初ここに投稿)問題のコードを含めるための適切な方法ではない場合。
例外はstreambufの202行目で一貫して発生しているようです(おそらくそれは役に立ちますか?)。
本当に私を捨てているのは、一見無作為であることです。これが初めてこの問題に遭遇したので、どこからバグを探し始めるか分かりません。この例外に関する他の投稿に基づいて、ポインタの使用に問題があると思われますか?
解決方法やバグの処理方法についての助けをいただければ幸いです。 outFile.write((char*) &F, length * sizeof(float));
私が何をしたいことだと思う:
outFile.write((char*) F, length * sizeof(float));
あなたはポインタのアドレスから始まるメモリをダンプする
は、私は、問題はここにあると信じて、 グレッグ
ありがとうございました、それはそれを修正したようです。 – GregD
もっと堅牢なファイル形式に関するもう1つのコメント。どういう意味ですか?何をお勧めしますか?再度、感謝します。 – GregD
メモリをダンプすると、異なるアーキテクチャー(または異なるコンパイラー...)のマシンに移植できない形式になります。出力時にデータをフォーマットする必要があります(単純な.csv形式を生成するためにstdoutを使用することも良いでしょう) – antlersoft