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

あなたの「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
    }
}
于 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

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

}
于 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 に答える