2013-09-25 38 views
1

我得到无效转换从void*FILE*编译下面的文件时出现错误。它需要的文件名作为参数,并试图打开该文件,如果文件打开它,否则返回NULL获取错误编译C++代码(无效转换)

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

FILE* open(const char filename[]); 

int main(int argc, char *argv[]) 
{ 
    FILE* fp = open("test.txt"); 
} 

FILE* open(const char filename[]) 
{ 
    ifstream myFile; 
    myFile.open(filename); 
    if(myFile.is_open()) 
     return myFile; 
    else 
     return NULL; 
} 
+3

转换从NULL到FILE *是最少的问题。你也从std :: ifstream转换为FILE *,这是完全不同的结构,更不用说一个是局部变量而另一个是指针。另外,你没有从main返回一个值。 –

回答

3

你的“open”声明返回“FILE *”,但实际返回一个ifstream。

请注意,“打开”与标准库的“打开”功能冲突,所以这也可能是功能名称的一个糟糕的选择。

您可以返回一个ifstream,也可以将一个参数作为参数进行初始化。

bool openFile(ifstream& file, const char* filename) 
{ 
    file.open(filename); 
    return !file.is_open(); 
} 

int main(int argc, const char* argv[]) 
{ 
    ifstream file; 
    if (!openFile(file, "prefixRanges.txt")) 
     // we have a problem 

} 

如果你真的想从函数返回的文件:

ifstream openFile(const char* filename) 
{ 
    ifstream myFile; 
    myFile.open(filename); 
    return myFile; 
} 

int main(int argc, const char* argv[]) 
{ 
    ifstream myFile = openFile("prefixRanges.txt"); 
    if (!myFile.is_open()) 
     // that's no moon. 
} 

由于这表明,虽然,除非“中openFile”会做更多的东西,这是一个有点多余。比较:

int main(int argc, const char* argv[]) 
{ 
    ifstream file("prefixRanges.txt"); 
    if (!file.is_open()) { 
     std::cout << "Unable to open file." << std::endl; 
     return 1; 
    } 
    // other stuff 
} 

如果你真正需要的,不过,是一个文件*,你必须写C-像这样的代码:

#include <cstdio> 

FILE* openFile(const char* filename) 
{ 
    FILE* fp = std::fopen(filename, "r"); 
    return fp; 
} 

int main(int argc, const char* argv[]) 
{ 
    FILE* fp = openFile("prefixRanges.txt"); 
    if (!fp) { 
     // that's no moon, or file 
    } 
} 

或只是

#include <cstdio> 

int main(int argc, const char* argv[]) 
{ 
    FILE* fp = std::fopen("prefixRanges.txt", "r"); 
    if (!fp) { 
     // that's no moon, or file 
    } 
} 
+0

我可能会这样做,但自从我的学校作业以来,我需要返回一个FILE指针,否则它不会通过测试仪。 – Nakib

+0

@Nakib然后你可能想使用从cstdio fopen(见最后一个例子) – kfsone

+0

@kfsone好吧谢谢,并不是只在C ..打开? – Nakib

1

您不能返回std::ifstream对象FILE*返回 文件指针。尝试改变:

FILE* open(const char filename[]) 

std::ifstream open(const char* filename) 

和而不是检查NULL是否已返回,使用std::ifstream::is_open()

std::ifstream is = open("myfile.txt"); 
if (!is.is_open()) { 
    // file hasn't been opened properly 
} 
1

myFileifstream对象。

你不能回击一个FILE指针

你也不能返回std::ifstream,因为它没有一个拷贝构造函数

您可以通过引用传递它

bool openFile(ifstream& fin, const char *filename) { 
    fin.open(filename); 
    return fin.is_open(); 
} 

In main

ifstream fin; 
if(!openFile(fin, "input.txt")){ 

} 
+0

我需要做什么更改才能将其作为FILE指针 – Nakib

+0

@Nakib使用标准C库而不是STL来返回它。 –

0

试试这个: -

std::ifstream open(const char* filename) 

代替

FILE* open(const char filename[]) 

也尽量returnmain功能有一定的价值。