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;
和其他相关代码一切都很好。我真的不明白这里出了什么问题。谢谢您的帮助。
答案 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指针。
完成后再关闭它。