1

在编译下面的文件时,我得到了从错误到错误的无效转换。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

4 回答 4

3

您的“打开”声称返回“文件 *”,但实际上返回一个 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
    }
}
于 2013-09-25T19:14:38.823 回答
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
}
于 2013-09-25T19:10:42.610 回答
1

myFile是一个ifstream对象。

您不能将其作为FILE指针返回

你也不能返回std::ifstream,因为它没有复制构造函数

您可以通过引用传递它

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

在主要

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

}
于 2013-09-25T19:11:29.333 回答
0

尝试这个:-

std::ifstream open(const char* filename)

代替

FILE* open(const char filename[])

还要尝试从您的功能中获得return一些价值。main

于 2013-09-25T19:11:38.570 回答