0
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;

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

4

3 回答 3

2

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

它的意思是“指针FILE”,其中FILE是一个“对象”,即一组数据字段,用于表示打开的文件,而该文件又具有当前位置。

当您对文件执行 I/O 时,这些字段(或更下方的字段)会发生变化,但FILE *指针值本身不会发生变化。所以你不能复制FILE *到“保存”文件中的位置。您必须使用ftell()andfseek()在文件中跳转。

于 2014-11-26T14:56:29.720 回答
1

fpval只是一个未初始化的指针,因此崩溃。但是,即使您正确复制了FILE *. 相反,您应该只在文件中保留两个查找位置,并使用ftell/fseek在您正在阅读的两个区域之间切换。

于 2014-11-26T14:48:25.737 回答
1

您正在推迟 fpval 并且变量未初始化,这会导致分段错误。此外,您不能以这种方式复制文件指针,您需要复制底层文件描述符,例如:

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

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

然后在完成后关闭它。

于 2014-11-26T14:55:30.930 回答