我需要在不同的函数中初始化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作为指针传递,而不是将其作为返回值。
答案 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)