我在VC++中,自己编写了OnfileOpen,用来打开一个存字符串的文件,再把字符串转化为数组,但我一运行“打开”菜单,就出现关闭对话框,单击调试,就出现“Uhandled exception in scxt.exe (MSVCRTD.DLL):0XC00000005:access violation."再单击确定,就出现标题为”find source“的对话框,上面有:“Please enter the path for INPUT.C"下面是文件打开路径选择对话框。我搞不民百为什么?大家半忙!!!
解决方案 »
- beaugauge控件的实现方法?
- MFC对话框实现随时间移动的网格问题!急~
- 救急,高手进!!!如何向密码框内输入密码
- 树控件 复选框
- 如何制作动画效果
- 问一个关于代理服务器的简单问题。QQ and HTTP
- 怎样用EnumChildProc遍历另一个程序的子窗口,改变其中一个edit框的值?
- 请教高手们一个关于资源的问题!
- 如何知道在CListCtrl中选中了哪个CheckBox了呢?大送分。。。!!
- 非mfc程序在vc6.0理怎么编译
- 文本文件,每行都是以“\n”结尾,读取错误,等待?
- 在对话框中有三个按钮,按下按钮时在对话框中切换这三个画面(Propertypage),怎么在propertypage中响应鼠标事件???
你最好铁代码出来.你应该用CallStack看看错误的地方的位置
{
// 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);
if(dlg.DoModal()==IDOK)
{
filename=dlg.GetFileName();
CStdioFile file;
CString tmp;
if(file.Open(filename,CFile::modeRead))
{
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);
}
{
do
{
if(!file.ReadString(tmp)) break;
tmp = new CString;//////////added by hwg需要分配内存///////////
strArray.Add(tmp);
}while(1);
file.Close();
}
C:\My Documents\My programs\scxt\scxtDoc.cpp(359) : error C2679: binary '=' : no operator defined which takes a right-hand operand of type 'class CString *' (or there is no acceptable conversion)
我是菜鸟。
Linking...
scxtView.obj : error LNK2001: unresolved external symbol "protected: void __thiscall CScxtView::OnFileOpen(void)" (?OnFileOpen@CScxtView@@IAEXXZ)
Debug/scxt.exe : fatal error LNK1120: 1 unresolved externals
我看不懂。我还查了出现OnFileOpen的地方有六处:
C:\My Documents\My programs\scxt\scxt.cpp(27): ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
C:\My Documents\My programs\scxt\scxtDoc.cpp(34): ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
C:\My Documents\My programs\scxt\scxtDoc.cpp(383):void CScxtDoc::OnFileOpen()
C:\My Documents\My programs\scxt\scxtDoc.h(68): afx_msg void OnFileOpen();
C:\My Documents\My programs\scxt\scxtView.cpp(37): ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
C:\My Documents\My programs\scxt\scxtView.h(76): afx_msg void OnFileOpen();
6 occurrence(s) have been found.
C:\My Documents\My programs\scxt\scxtView.cpp(37): ON_COMMAND(ID_FILE_OPEN, OnFileOpen)和
C:\My Documents\My programs\scxt\scxtView.h(76): afx_msg void OnFileOpen();
两处删掉,程序就没错了,可以运行,但我在本问题开始的问题有出现了,但我在CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT ,str,NULL);语句前家的:
MessageBox(NULL,"HElp", "ERROR", MB_OK);却可以出现,问题可能出现在dlg的创建语句这里,但为什么呢?还请你多帮忙
CStdioFile file;
CString tmp;
if(file.Open(filename,CFile::modeRead))
{
do
{
if(!file.ReadString(tmp)) break;
strArray.Add(tmp);
}while(1);
这几句的问题
if(!file.ReadString(tmp)) break;
strArray.Add(tmp);
}while(1);
可能是指针用错了或可能是字符串转化为数组时出问题了,怎么改,谁帮帮忙?
新建一个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]
//文件保存
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)
(0.000000,0.000000,0.000000)
(0.000000,0.000000,0.000000)
(0.000000,0.000000,0.000000)
(0.000000,0.000000,0.000000)
.......
出现的错误是由于你对函数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]