C++ 文件*在不同功能c和x2B中初始化+;
我需要在不同的函数中初始化文件*fi。这个示例代码显示了这个问题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;
#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");
}