2016-08-24 88 views
-4

我正在使用cern的數據分析框架ROOT。我想要做的是在ascii文件中導出TH1F直方圖的內容。我的示例代碼如下從'void *'無效轉換爲'FILE *' - ROOT

#include "TH1.h" 
#include "TH1F.h" 

#include <iostream> 
#include <fstream> 
using namespace std; 

void histo2ascii(TH1* hist){ 

    ofstream myfile; 
    myfile.open ("movie_small.txt"); 

    for (int i=1; i<=hist->GetNbinsX(); i++){ 
     if(hist->GetBinCenter(i)>5.e-3 && hist->GetBinCenter(i)<7.e-3){ 
      //myfile << (float) hist->GetBinCenter(i) << "\t" << hist->GetBinContent(i) << endl; 
      fprintf(myfile, "%.17g \t %d", hist->GetBinCenter(i), (int) hist->GetBinContent(i)); 
     } 
    } 

    myfile.close(); 

} 

的問題是,當我編譯它(OK,通過CINT,使用.L code.C++:/)我收到以下錯誤

invalid conversion from ‘void*’ to ‘FILE*’

at fprintf line。

任何想法爲什麼這可能會發生?

+0

我認爲你需要[找到一個好的初學者書](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list),並重新開始如何文件輸入和輸出在C++中使用流。提示:如果您使用'std :: cout'打印任何您獲得輸出的基礎知識。 –

+0

什麼是「(通過cint,使用.L code.C++:/)」是什麼意思? –

+0

@ M.M ROOT使用解釋器來運行通過'.L filename.C'加載的C++代碼。執行'.L filename.C +'將代碼編譯到一個庫中,而不是依賴於解釋器。第二個'+'是一個錯字,但是一個無害的 - ROOT仍然解釋它一樣。 – Chris

回答

1

fprintf預計FILE*,而不是ofstream。這種方式不能使用C風格的打印功能。

使用流,就像您在fprintf行上方註釋掉的行中所做的一樣。如果要設置精度,請使用:

myfile << std::setprecision(2) << hist->GetBinCenter(i). 

不要忘記包含<iomanip>。有關流操縱器的列表,請參見this page

編輯:正如評論中所述,myfile隱含轉換爲void*,因爲fprintf需要一個指針。這就是爲什麼它會抱怨void*而不是ofstream

+1

抱怨來自[此轉換運算符](http://en.cppreference.com/w/cpp/io/basic_ios/operator_bool)。 'fprintf'需要一個指針,所以編譯器使用轉換運算符。由於C++比C更強大,編譯器會抱怨將'void *'轉換爲'FILE *'。 –

+0

@JoachimPileborg感謝您的解釋。我不知道他們在C++ 11之前進行了這種隱式轉換。 –

+1

這是一個可以在布爾表達式中使用的流。爲什麼他們最初使用這個指針我不知道。 –

相關問題