【问题标题】:Getting error compiling C++ code (Invalid Conversion)编译 C++ 代码时出错(无效转换)
【发布时间】:2013-09-25 19:06:59
【问题描述】:

我在编译以下文件时收到 invalid conversion from void* to 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;
}

【问题讨论】:

  • 从 NULL 到 FILE* 的转换是最少的问题。您还将从 std::ifstream 转换为 FILE*,它们是完全不同的结构,更不用说一个是局部变量,另一个是指针。此外,您不会从 main 返回值。

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


【解决方案1】:

您的“open”声称返回“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
    }
}

【讨论】:

  • 我可能会这样做,但由于这是我的学校作业,我需要返回一个 FILE 指针,否则它将无法通过测试器。
  • @Nakib 然后你可能想从 cstdio 使用 fopen (见最后一个例子)
  • 不——我们仍然可以使用 C 标准库——如果你真的想的话,你可以#include ,但还有 将函数封装到“std: :" 命名空间,这是一种更好的做法。
【解决方案2】:

您不能将 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
}

【讨论】:

    【解决方案3】:

    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")){
    
    }
    

    【讨论】:

    • 我需要进行哪些更改才能将其作为文件指针返回
    • @Nakib 使用标准 C 库而不是 STL。
    【解决方案4】:

    试试这个:-

    std::ifstream open(const char* filename)
    

    而不是

    FILE* open(const char filename[])
    

    还可以尝试从您的main 函数中获取return 一些值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-22
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      相关资源
      最近更新 更多