2013-03-14 100 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,但現在我認爲不是。 感謝您的幫助。非常感謝。