获取编译C ++代码的错误(无效转换)

时间:2013-09-25 19:06:59

标签: c++ file file-io compiler-errors ifstream

在编译下面的文件时,我得到void*FILE* 的无效转换错误。它将文件名作为参数并尝试打开文件,如果文件打开则返回 文件指针否则返回 NULL

#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;
}

4 个答案:

答案 0 :(得分:3)

您的“开放”声称返回“FILE *”但实际上会返回ifstream。

请注意,“open”与标准库的“open”函数冲突,因此这也可能是函数名称的不良选择。

您可以返回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
}

如果您确实需要的是FILE *,则必须编写类似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
    }
}

答案 1 :(得分: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
}

答案 2 :(得分:1)

myFileifstream个对象。

您不能将其作为FILE指针

返回

此外,您无法返回std::ifstream,因为它没有复制构造函数

您可以通过引用传递

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

主要

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

}

答案 3 :(得分:0)

试试这个: -

std::ifstream open(const char* filename)

而不是

FILE* open(const char filename[])

还尝试从return函数main中获取一些值。