VC++ 读取TXT文件内容的有关问题

VC++ 读取TXT文件内容的问题
TXT文件中的内容:
(001, science, Java, NC.BC, 2007, Bill, 8.99, 10, 9)

编译完全通过了,但运行过程中不断有问题,求助,谢谢了。

代码如下:
void CAFile::OnBnClickedButton1()
{
// TODO: Add your control notification handler code here
CFileDialog cFileDlg(TRUE,_T("txt"),(LPCTSTR)NULL,OFN_ENABLESIZING | OFN_EXPLORER | OFN_PATHMUSTEXIST
|OFN_LONGNAMES | OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST | OFN_CREATEPROMPT , _T("Text Files(*.txt)|*.txt| All Files(*.*)|*.*|"),this);


if(cFileDlg.DoModal()!=IDOK)
{
return;
}


//对文件的处理

    // CFile file(cFileDlg.GetPathName(),CFile::modeRead);
    CString path = cFileDlg.GetPathName();
FILE*   fp;
errno_t err;
err = fopen_s(&fp,path,"r");
if(fp   ==   0)   
return;     

CPtrArray   IFO; 

char   szBuf[4096]; 
while(!feof(fp))                                   

memset(szBuf,   0,   4096);   
fgets(szBuf,   4096,   fp);   

CString   str   =   szBuf; 

int   nPos0   =   str.Find( "(");
int   nPos1   =   str.Find( ", ",   nPos0+1);                     //解析 "| "的位置是为了得到分隔符的位置, 
int   nPos2   =   str.Find( ", ",   nPos1+1);   //从而确定内容的位置.第一个参数是要搜索的字符 
int   nPos3   =   str.Find( ", ",   nPos2+1);   //第二个参数是起始位置. 
int   nPos4   =   str.Find( ", ",   nPos3+1); 
int   nPos5   =   str.Find( ", ",   nPos4+1); 
int   nPos6   =   str.Find( ", ",   nPos5+1); 
int   nPos7   =   str.Find( ", ",   nPos6+1); 
int   nPos8   =   str.Find( ", ",   nPos7+1); 
int   nPos9   =   str.Find( ")",   nPos8+1);

CString   bno   =   str.Mid(nPos0+1,   nPos1-nPos0-1); //定义一些CString成员,使其可以使用 
CString   category   =   str.Mid(nPos1+1,   nPos2-nPos1-1);         //CString的成员函数Mid,得到需要的 
CString   bname   =   str.Mid(nPos2+1,   nPos3-nPos2-1);         //元素. 
CString   publisher   =   str.Mid(nPos3+1,   nPos4-nPos3-1); 
CString   year   =   str.Mid(nPos4+1,   nPos5-nPos4-1); 
CString   auther   =   str.Mid(nPos5+1,   nPos6-nPos5-1); 
CString   price   =   str.Mid(nPos6+1,   nPos7-nPos6-1); 
CString   collection   =   str.Mid(nPos7+1,   nPos8-nPos7-1); 
CString   stock   =   str.Mid(nPos8+1,   nPos9-nPos8-1); 


//得到字符串其中的一段.第一个参数是起始位置,第二个参数是要得到的字符串的长度. 

Book*   pInfo   =   new   Book; //声明一个结构指针,使其可以调用这个结构的成员,来缓存 
strcpy_s(pInfo-> bno, 128, bno);           //各个元素.利用字符串处理函数strcpy. 
strcpy_s(pInfo-> category,128, category); 
strcpy_s(pInfo-> bname, 128,  bname); 
strcpy_s(pInfo-> publisher, 128,  publisher); 
strcpy_s(pInfo-> year, 128,  year); 
strcpy_s(pInfo-> auther, 128,  auther); 
strcpy_s(pInfo-> price, 128,  price); 
strcpy_s(pInfo-> collect, 128,  collection); 
strcpy_s(pInfo-> stock, 128,  stock); 

IFO.Add(pInfo);                                 //将结构指针pinfo内容全部存入CPtrArray成员IFO,使其可以 
}       //使用aCPtrArray的成员函数 

//上面是完成读入数据,并且传入缓存,传入缓存的目的是为了使用CPtrArray的成员函数, 


for(int   i=0;i <IFO.GetSize();i++)       //IFO.GetSize()取得的是IFO的行数.每读取一行,GetSize加1