把一个文本文件,每行都是以“\n”,结尾的字湖串读出放到一个字符串类数组里,但有问题,编译没问题,运行时出错,
CStdio file;
CString tmp;
CStringArray atrrArray;
//用debug跟踪以下几句错
if(!file.ReadString(tmp)) break;
strArray.Add(tmp);
}while(1);
可能是指针用错了或可能是字符串转化为数组时出问题了,怎么改,谁帮帮忙?
改为while(file.ReadString(tmp))
strArray.Add(tmp);
还是错。。
不明白的可参考: VC++运行时,用自己边的OnfileOpen打开文件错误 一贴,我把他提前了
CStdio file;
CString tmp;
CStringArray atrrArray;
//用debug跟踪以下几句错
if(!file.ReadString(tmp)) break;
strArray.Add(tmp);
}while(1);
可能是指针用错了或可能是字符串转化为数组时出问题了,怎么改,谁帮帮忙?
改为while(file.ReadString(tmp))
strArray.Add(tmp);
还是错。。
不明白的可参考: VC++运行时,用自己边的OnfileOpen打开文件错误 一贴,我把他提前了
新建一个temp工程,选择Win32 console application!// temp.cpp : Defines the entry point for the console application.
//#include "stdafx.h"
#include <iostream.h>
#include <fstream.h>
#include <afx.h>
void main (void)
{
CStdioFile fileInput;
fileInput.Open("First.txt",CFile::modeRead);
CString strTemp;
CStringArray strArray;
while(fileInput.ReadString(strTemp))
strArray.Add(strTemp);
int size=strArray.GetSize();
for(int i=0;i<size;i++)
cout<<strArray.GetAt(i)<<endl;
}
------------------
在你的工程目录下建立一个文件first.txt
内容如下:
VINET:这是测试数据
TOMSP:这是测试数据
HANAR:这是测试数据
VICTE:这是测试数据
SUPRD::这是测试数据
HANAR:这是测试数据
CHOPS:这是测试数据
RICSU:这是测试数据
WELLI:这是测试数据
HILAA:这是测试数据
ERNSH:这是测试数据
CENTC:这是测试数据
OTTIK:这是测试数据
QUEDE:这是测试数据
RATTC:这是测试数据
ERNSH:这是测试数据
FOLKO:这是测试数据
BLONP:这是测试数据
WARTH:这是测试数据
FRANK:这是测试数据
GROSR:这是测试数据
WHITC:这是测试数据
WARTH:这是测试数据
SPLIR:这是测试数据
RATTC:这是测试数据
QUICK:这是测试数据
VINET:这是测试数据
MAGAA:这是测试数据
TORTU:这是测试数据
MORGK:这是测试数据
BERGS:这是测试数据
LEHMS:这是测试数据
BERGS:这是测试数据
ROMEY:这是测试数据
ROMEY:这是测试数据
LILAS:这是测试数据
LEHMS:这是测试数据
QUICK:这是测试数据
QUICK:这是测试数据
QUICK:这是测试数据
Love:This is the love!
---------------------------------
PS.
别忘了在project-->setting->General选项卡中选择using mfc in a shared dll
[email protected]
{
// TODO: Add your command handler code here CString filename;
CStringArray strArray;
CString str="dra files (*.dra)|*.dra||";
MessageBox(NULL,"HElp", "ERROR", MB_OK); CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT ,str,NULL);
if(dlg.DoModal()==IDOK)
{
filename=dlg.GetFileName();
CStdioFile file;
CString tmp;
if(file.Open(filename,CFile::modeRead))
{
while(file.ReadString(tmp))
strArray.Add(tmp);
/* do
{
if(!file.ReadString(tmp)) break;
strArray.Add(tmp);
}while(1);*/
file.Close();
}
}
if(strcmp(strArray[0],"onresultdata1=2")==0)
{
sscanf(strArray[0],"onresultdata1=%d",onresultdata1);
sscanf(strArray[1],"nsteps=%d",nsteps);
CString t;
t.Format("nsteps=%d",nsteps);
AfxMessageBox(t,MB_OK,0);
for(int j=2;j<strArray.GetSize();j++)
{
sscanf(strArray[j],"(%f,%f,%f)",partdata[j][0],partdata[j][1],partdata[j][2]);
}
}
if(strcmp(strArray[0],"onresultdata1=4")==0)
{
sscanf(strArray[0],"onresultdata1=%d",onresultdata1);
sscanf(strArray[1],"ngroup=%d",ngroup);
sscanf(strArray[2],"nsteps=%d",nsteps);
for(int j=3;j<strArray.GetSize();j++)
{
sscanf(strArray[j],"(%f,%f,%f)",alldata[j][0],alldata[j][1],alldata[j][2]);
}
}
UpdateAllViews(NULL);
//文件保存
void CScxtDoc::OnFileSave()
{
if(onresultdata1==2)
{
CString string;
CStringArray strArray; //你的文字串组;(传入)
strArray.Add("onresultdata1=2\n");
string.Format("nsteps=%d\n",nsteps);
strArray.Add(string);
for(int i=0;i<nsteps;i++)
{
string.Format("(%f,%f,%f)\n",partdata[i][0],partdata[i][1],partdata[i][2]);
strArray.Add(string);
}
CString str="文体文件(*.dra)|*.dra||";
CFileDialog FileDlg(FALSE,NULL,NULL,OFN_HIDEREADONLY |OFN_OVERWRITEPROMPT,str,NULL);
if(FileDlg.DoModal()==IDOK)
{ CString filename;
filename=FileDlg.GetPathName()+CString(".dra");
CStdioFile file(filename,CFile::modeCreate | CFile::modeReadWrite | CFile::typeText );
file.SeekToBegin();
for(int j=0;j<strArray.GetSize();j++)
{
file.WriteString(strArray[j]);
}
file.Close();
}
}
}保存的文件如下:
onresultdata1=2
nsteps=180
(0.000000,0.000000,0.000000)
(0.000000,0.000000,0.000000)
(0.000000,0.000000,0.000000)
(0.000000,0.000000,0.000000)
(0.000000,0.000000,0.000000)
(0.000000,0.000000,0.000000)
(0.000000,0.000000,0.000000)
(0.000000,0.000000,0.000000)
(0.000000,0.000000,0.000000)
(0.000000,0.000000,0.000000)
(0.000000,0.000000,0.000000)
...........
CStringArray添加的应该是指针吧? CString* tmp = new CString; if(file.Open(filename,CFile::modeRead))
{
while(file.ReadString(*tmp))//不知道引用可不可以用这种参数
//不行的话,你改一下.
{
strArray.Add(tmp);
tmp = new CString;
} file.Close();
}
出现的错误是由于你对函数sscanf()使用不正确造成的!
我给出了一种修改方法:
(注意:为了简化,我将你的数据文件中的坐标中括号给删掉了,这不会影响你的程序的!----你在村数据文件的时候直接去掉格式字符串中的"()"就行了!
在每一行的末尾我用逗号分割,例如:
string.Format
("%f,%f,%f,\n",
partdata[i][0],
partdata[i][1],
partdata[i][2]);
strArray.Add(string);
)
--------------------
我一般不使用sscanf()函数,他有太多的限制,用起来很令人恶心!
// CTestCStdioFileDoc commandsvoid CTestCStdioFileDoc::OnFileOpen()
{
// TODO: Add your command handler code here CString filename;
CStringArray strArray;
CString str="dra files (*.dra)|*.dra||";
CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT ,str,NULL);
//Show the Open FileDialog Box!
if(dlg.DoModal()==IDOK)
{
filename=dlg.GetFileName();
CStdioFile file;
CString tmp;
if(file.Open(filename,CFile::modeRead))
{
while(file.ReadString(tmp))
strArray.Add(tmp);
file.Close();
}
}
//Read data from the strArray! That is ,the input file!
if(strcmp(strArray[0],"onresultdata1=2")==0)
{
CString strTemp;
strTemp=strArray[0];
int position=strTemp.Find('=')+1; //delete the substring "onresultdata1="from the strTemp!
strTemp.Delete(0,position);
//convert to integer type
onresultdata1 = atoi((LPTSTR)(LPCTSTR)strTemp);
strTemp=strArray[1];
position=strTemp.Find('=')+1;
strTemp.Delete(0,position);
nsteps= atoi((LPTSTR)(LPCTSTR)strTemp); CString t;
t.Format("nsteps=%d",nsteps);
MessageBox(NULL,t,"The result of steps",MB_OK); CString subString[3];
//must change the code in here
for(int j=0;j<nsteps;j++)
{
strTemp=strArray[j+2];
for(int index=0;index<3;index++)
{
position=strTemp.Find(',')+1;
subString[index]=strTemp.Left(position);
//convert to double type
partdata[j][index]=atof((LPTSTR)(LPCTSTR)subString[index]);
strTemp.Delete(0,position);
}
}
} //我将你下面的代码屏蔽掉了,你可以根据我的上面的代码修改
/* if(strcmp(strArray[0],"onresultdata1=4")==0)
{
sscanf(strArray[0],"onresultdata1=%d",onresultdata1);
sscanf(strArray[1],"ngroup=%d",ngroup);
sscanf(strArray[2],"nsteps=%d",nsteps);
for(int j=3;j<strArray.GetSize();j++)
{
sscanf(strArray[j],"(%f,%f,%f)",alldata[j][0],alldata[j][1],alldata[j][2]);
}
}
*/
UpdateAllViews(NULL);
}void CTestCStdioFileDoc::OnFileSave()
{
// TODO: Add your command handler code here
if(onresultdata1==2)
{
CString string;
CStringArray strArray; //你的文字串组;(传入)
strArray.Add("onresultdata1=2\n");
string.Format("nsteps=%d\n",nsteps);
strArray.Add(string);
//每一行的末尾用逗号分割
for(int i=0;i<nsteps-1;i++)
{
string.Format("%f,%f,%f,\n",partdata[i][0],partdata[i][1],partdata[i][2]);
strArray.Add(string);
}
//去掉最后一行的回车符
string.Format("%f,%f,%f,",partdata[nsteps-1][0],partdata[nsteps-1][1],partdata[nsteps-1][2]);
strArray.Add(string); CString str="文体文件(*.dra)|*.dra||";
CFileDialog FileDlg(FALSE,NULL,NULL,OFN_HIDEREADONLY |OFN_OVERWRITEPROMPT,str,NULL);
if(FileDlg.DoModal()==IDOK)
{ CString filename;
filename=FileDlg.GetPathName()+CString(".dra");
CStdioFile file(filename,CFile::modeCreate | CFile::modeReadWrite | CFile::typeText );
file.SeekToBegin();
for(int j=0;j<strArray.GetSize();j++)
{
file.WriteString(strArray[j]);
}
file.Close();
}
}
}---------------------
我的测试数据为:file:testdata.dra
onresultdata1=2
nsteps=15
0.000000,0.255555,0.000000,
0.000000,0.000000,0.545666,
0.556666,0.000000,0.000000,
0.000000,0.568999,0.000000,
0.000000,0.455555,0.000000,
0.000000,0.000000,0.565844,
0.445555,0.000000,0.000000,
0.000000,0.000000,0.255555,
0.000000,0.456789,0.000000,
0.123456,0.000000,0.000000,
0.000000,0.568796,0.000000,
0.000000,0.000000,0.564444,
0.000000,0.456778,0.000000,
0.456123,0.000000,0.000000,
0.000000,0.456112,0.000000,
-----------------------------
保存后的数据和上面的完全一样!
你的程序是的话了2个小时的时间,就是为了找出你说的bug,想不到被你误导了!希望你以后碰到错误时,多考虑一下,也许是别的地方引起的!
跳出三届外,不再五行中
如果还有疑问发信到:
[email protected]