2013-03-14 96 views
-1

使用ofstream将双数组输出到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为double。对我没有任何伤害。

这里是文件名的定义:

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;  
} 
+0

它是编译器错误?你能告诉我们错误吗? – idoo 2013-03-14 13:40:26

+0

对不起,让我再编辑一下。 – 2013-03-14 13:41:14

+3

你有更多的问题:首先你说你想写入一个文本文件,但你打开文件在二进制模式。最严重的问题可能是函数末尾的'delete',尤其是如果你想在调用之后使用你传递给函数的数组。 – 2013-03-14 13:41:39

回答

0

好吧终于我得到了我做错的地方:

tmp += 6; 

我的程序是将26个元素的数组内插到256个元素。但插值数组的前6个元素必须为0;所以我创建了一个长度为256-6 = 250的新数组;

double nPtCal = 256; 
double * tmp = new double[nPtCal-5]; 

但不知何故,我也移动通过6.本TMP指针我想,如果我创建与长度为256的阵列这将是正确的;所以没有出人意料的错误发生。因为当操作填充256-6 = 250个元素时,如果指针已经指向总数250中的第6个元素,则它最终将超出范围,因为我基本上将指针移动250次以处理所有250个元素在新阵列中。 这就是为什么我不断收到错误。我认为这是因为一些文件IO,但现在我认为不是。 感谢您的帮助。非常感谢。