将文件指针传递给函数

时间:2017-07-10 10:02:59

标签: c++

如果我将FILE指针传递给函数,是否更新了?

我可以执行以下操作吗?

FILE* fp;
size_t read, len;
char *key;
fp=fopen((tmpDir+"/"+filename).c_str(),"r");
while((read=getline(&key,&len,fp))!=-1){
  if (header_section){
    processHeader(fp);
  }else{
    processBody(fp);
  }
}
fclose(fp);

void processHeader(FILE* fp){
  size_t read, len;
  char *key;
  while((read=getline(&key,&len,fp))!=-1){
    ... do header processing ...
    if(strcmp(key,"end_of_header")==0){
      return;
    }
  }
}
void processBody(FILE* fp){
  size_t read, len;
  char *key;
  while((read=getline(&key,&len,fp))!=-1){
    ... process body data ...
  }
}

上面的代码不起作用(我收到了分段错误)。有没有办法根据文件的部分处理不同功能的文本文件的部分?

1 个答案:

答案 0 :(得分:0)

是的,可以将FILE *传递给函数。毕竟,各种标准C I / O函数接受一个指针参数。

但是,FILE是一种不透明的类型。更新的FILE *点(例如数据结构)是否是实现定义的。但是,如果您的代码在FILE *上执行有效的操作(例如,将其传递给C I / O函数),则无法解释分段错误。

您提供的部分代码不足以确定“分段错误”的原因。可能的情况是,如果程序崩溃,程序中的某些代码会显示未定义的行为。但是,将作为FILE *的返回值获得的fopen()作为参数传递给函数的简单行为不是原因。您需要查看程序中的其他代码。

而且,在C ++中,使用C ++流比使用C / I函数更好。但是,最多只会改变症状。如果其他代码是导致未定义行为的原因,那么更改I / O方法(假设您正确执行)将无法解决此问题。