2016-08-24 50 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

这是一个可以在布尔表达式中使用的流。为什么他们最初使用这个指针我不知道。 –

相关问题