C++ 文件*在不同功能c和x2B中初始化+;

C++ 文件*在不同功能c和x2B中初始化+;,c++,function,file,pointers,initialization,C++,Function,File,Pointers,Initialization,我需要在不同的函数中初始化文件*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;

我需要在不同的函数中初始化文件*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;  
}
#包括
使用名称空间std;
void init(文件*fi)
{ 
fi=fopen(“in.txt”、“r”);
如果(fi==NULL)
{       
好的,明白了

重放

void init(FILE* fi) 


除非这是代码的特定目的,否则不应操纵参数。最好只返回以下内容:

然后你这样称呼它:

FILE* fi = init();
<>注意,由于使用C++,应该避免使用C过时的代码,如“代码>文件< /代码>,而使用C++文件流。 如果需要处理多个返回值:

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

在这种情况下,您甚至不需要返回值。如果您编写一个适当的析构函数,当包装类被释放时,您还可以自动清理这些文件句柄。

In.txt与您的可执行文件位于同一个方向上?是的,文件没有问题,指针fi在main中等于NULL,但在init中不等于
fi
是eff这是一个C++的局部变量,需要通过引用传递指针。如果这是标记C++,请在“通过引用”中读取参数,以及如何在C++中传递参数。因为很明显,(指针)<代码> FI>代码>的值被传递到 init()中。
在这里,因此对
ìnit()
中该值的任何更改在
init()
之外无效。可能重复:这是一个“修复”但它只是把事情弄得一团糟。重要的是,我把FI作为指针传递,而不是把它当作返回值。为什么这么重要?你需要澄清,因为在你的代码中不是这样的。在旧的C语言中,你偶尔会使用指针指针来进行这种事情,但是C++中有一个围绕返回的强大的哲学。复制成本低的对象。我的代码只是一个例子,我试图让指针指向子进程的stdin和stdout,这是其中的两个,因此将它们作为指针传递更容易。您可能认为这更容易,但通常有一种比操纵参数更好的方法。不要传递可变参数,而是保存返回值。例如例如,您可以返回一个简单的
元组
结构
,其中包含值。
FILE* fi = init();
std::tuple<FILE*, FILE*> init() {
  return std::make_tuple(
    fopen("in.txt", "r"),
    fopen("out.txt", "w")
  );
}
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");
}