将文件指针指定给另一个时出现分段错误

时间:2014-11-26 14:40:56

标签: c pointers file-pointer

inline void readSymColValUpdRow(int *row, const int nmat, 
                                int **col, double **val, const int nnz, 
                                FILE *fpcol)
{
  *col = (int*)_mm_malloc(sizeof(int)*nnz, 64);
  *val = (double*)_mm_malloc(sizeof(double)*nnz, 64);
  FILE *fpval;
  *fpval = *fpcol;
   const int BUF_LEN = nnz*10;
   char buf[BUF_LEN];
   fgets(buf, BUF_LEN, fpval);
   fgets(buf, BUF_LEN, fpval);
   ...//other code
}

这就是我想要做的。我需要两个文件指针,引用函数“readSymColValUpdRow()”中文件中的不同位置。因此,我已经声明了一个文件指针* fpval并将fpcol的内容分配给它。 “fpcol”是函数参数传递的有效文件指针。我试着让fpval指向前面两行。 但是,我总是通过这样做得到“分段错误”。一旦我评论

*fpval = *fpcol;

和其他相关代码一切都很好。我真的不明白这里出了什么问题。谢谢您的帮助。

3 个答案:

答案 0 :(得分:2)

请注意,FILE *并不意味着指针值表示文件中的位置,并且您可以将其视为常规指针!

这意味着"指向FILE"的指针,其中FILE是"对象",即用于表示一个"的一堆数据字段打开文件,而后者又有一个当前位置。

当您对文件执行I / O时,这些字段(或更远的字段)会发生变化,但FILE *指针值本身并不会发生变化。因此,您无法将FILE *复制到"保存"文件中的位置。您必须使用ftell()fseek()在文件中跳转。

答案 1 :(得分:1)

fpval只是一个未初始化的指针,因此崩溃了。但是,即使您正确复制了FILE *,您尝试执行的操作也无法正常工作。相反,您应该在文件中保留两个搜索位置,并使用ftell / fseek在您正在阅读的两个区域之间切换。

答案 2 :(得分:1)

您正在引用fpval并且变量已经酉化,这会导致分段错误。此外,您不能以这种方式复制文件指针,您需要制作基础文件描述符的副本,例如:

FILE *fpval = fdopen(dup(fileno(fpcol)), "rb");

fileno将获取文件描述符,dup将复制它,fdopen将打开该文件描述符并创建新的FILE指针。

完成后再关闭它。