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