FILE *在不同的函数c ++中初始化

时间:2018-05-05 18:31:18

标签: c++ function file pointers initialization

我需要在不同的函数中初始化FILE * fi。此示例代码显示了问题。

#include<iostream>
using namespace std;

void init(FILE* fi) 
{ 
    fi=fopen("in.txt", "r");    
    if(fi==NULL) 
    {       
        cout<<"Got NULL\n";     
    } 
}

int main()  
{   
    FILE* fi;   
    init(fi);   
    if(fi==NULL)    
    {       
        cout<<"NULL\n";         
        return 0;   
    }   
    return 0;  
}

程序输出NULL(不是“Got NULL”),我不知道如何让它工作......

重要的是我将fi作为指针传递,而不是将其作为返回值。

2 个答案:

答案 0 :(得分:1)

你不应该操纵参数,除非这是代码的特定意图。简单地返回事情会更好:

FILE* init()
{ 
    return fopen("in.txt", "r");
}

然后你这样称呼它:

FILE* fi = init();

请注意,由于您使用的是C ++,因此应避免使用FILE之类的C错误,而应使用C ++文件流。

如果您需要处理多个返回值:

std::tuple<FILE*, FILE*> init() {
  return std::make_tuple(
    fopen("in.txt", "r"),
    fopen("out.txt", "w")
  );
}

这只是通过将所有这些内容封装在正确的class定义中来使其成为正确的C ++代码的一步,然后您可以直接操作属性:

class FileWrapper {
public:
  FileWrapper();
  ~FileWrapper();
  void init();

protected:
  FILE *fi;
  FILE *fo;
}

void FileWrapper::init() {
  fi = fopen("in.txt", "r");
  fo = fopen("out.txt", "w");
}

在这种情况下,您甚至不需要返回值。如果你编写了一个正确的析构函数,当你的包装类被解除分配时,你也能够自动清理那些文件句柄。

答案 1 :(得分:0)

好的,明白了。

Replase

void init(FILE* fi) 

void init(FILE*&fi)