ofstream を使用して double 配列を txt ファイルに出力すると、エラーが発生しました。コードは次のとおりです。
static void OutpuResults(std::string fileName, double * yCal, int nPtCal)
{
std::string value;
double * yCal_local = yCal;
std::ofstream outfile;
outfile.open(fileName.c_str());
for (int i = 0; i < nPtCal; i++)
{
outfile<<yCal_local[i]<<std::endl;
}
delete[] yCal_local;
outfile.close();
}
エラーはoutfile<<yCal_local[i]<<std::endl;
i=0のところで発生しyCal_local[i]
、倍精度で0.000000です。私には意味がありません。
fileName の定義は次のとおりです。
std::string fileName = "d:\\inter.txt";
yCal の定義は次のとおりです。
int nPtCal = 256;
double * yCal = new double[nPtCal];
私はどこで間違ったのだろうか?どんな提案でも大歓迎です。
編集:コンパイル時に問題はありませんが、実行時にエラーが発生します。エラーメッセージは次のとおりです。
Unhandled exception at 0x75f5812f in ppppp.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x0028f754..
そして、プログラムがエラーから戻ったときに表示されるコードは次のとおりです。
void __cdecl _unlock (
int locknum
)
{
/*
* leave the critical section.
*/
LeaveCriticalSection( _locktable[locknum].lock );
}
編集:
すべてのコードは次のとおりです。
#include "pppp.h"
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
static void show_usage(std::string name)
{
std::cerr << "To use ZoomCal:\n " << "ZoomCal.exe inputfile -options\n"
<< "options:\n"
<< " -l: linear\n"
<< " -c: cubic"<< std::endl;
}
static void LoadData(std::string fileName, double* y)
{
std::string value;
double * y_local = y;
char *cstr = new char[fileName.length() + 1];
std::strcpy(cstr, fileName.c_str());
std::ifstream infile;
infile.open(cstr);
if (!infile.is_open())
{
std::cerr<<"File loading failed. Double check if file exists in the same folder as ZoomCal.exe"<<std::endl;
exit(1);
}
int count = 0;
int i = 0;
int col = 10;
while ( infile.good() )
{
getline ( infile, value, ',' ); // read a string until next comma: http://www.cplusplus.com/reference/string/getline/
if (count % col == 0)
{
if (count != 0)
{
*y_local = std::atof(value.c_str());
y_local++;
}
}
count++;
}
//delete [] cstr;
//delete y_local;
infile.close();
}
static void OutpuResults(std::string fileName, double * yCal, int nPtCal)
{
std::string value;
//double * yCal_local = yCal;
std::ofstream outfile;
outfile.open(fileName.c_str());
for (int i = 0; i < nPtCal; i++)
{
outfile<<yCal[i]<<std::endl;
}
// delete[] yCal_local;
outfile.close();
}
double * LinInterp(double * y, int nPt, int nPtCal)
{
double * yCal = new double[nPtCal];
double * tmp = new double[nPtCal-5];
int interval = 10;
double * pPiece = new double[interval];
double f2, f1, m, b;
int x2, x1;
std::memset(yCal, 0, sizeof(double)*nPtCal);
tmp += 6;
for (int i = 0; i < (nPt - 1); i ++)
{
*pPiece = *y;
f2 = *(y + 1);
f1 = *y;
x2 = (i + 1) * interval;
x1 = i * interval;
m = (f2 - f1)/(x2 - x1);
b = f2 - m * x2;
for (int k = 1; k < interval; k++)
{
pPiece[k] = m * ((i * interval) + k) + b;
}
std::memcpy(tmp + (i * interval), pPiece, sizeof(double)*interval);
y++;
}
std::memcpy(yCal + 6, tmp, sizeof(double)*250);
return yCal;
}
double * CubInterp(double * y, int nPt, int nPtCal)
{
double * yCal = new double[nPtCal];
std::memset(yCal, 0, sizeof(double)*nPtCal);
return yCal;
}
int main(int argc, char* argv[])
{
if (argc < 3)
{
show_usage(argv[0]);
return 1;
}
std::vector <std::string> sources;
std::string destination;
for (int i = 1; i < argc; ++i)
{
std::string arg = argv[i];
if ((arg == "-h") || (arg == "--help"))
{
show_usage(argv[0]);
return 0;
}
else if ((arg == "-d") || (arg == "--destination"))
{
if (i + 1 < argc)
{ // Make sure we aren't at the end of argv!
destination = argv[i++]; // Increment 'i' so we don't get the argument as the next argv[i].
}
else
{ // Uh-oh, there was no argument to the destination option.
std::cerr << "--destination option requires one argument." << std::endl;
return 1;
}
}
else
{
sources.push_back(argv[i]);
}
}
int nPt = 26;
double * y = new double[nPt];
LoadData(sources[0], y);
int nPtCal = 256;
double * yCal = new double[nPtCal];
yCal = LinInterp(y, nPt, nPtCal);
std::string fileName = "D:\\inter.txt";
OutpuResults(fileName, yCal, nPtCal);
getchar();
return 1;
}