用VC读取DXF文件,用了DxfReader的部分代码,结果出问题了,求解释啊

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用VC读取DXF文件,用了DxfReader的部分代码,结果出问题了,求解释啊相关的知识,希望对你有一定的参考价值。

感觉完全自己写DXF读取程序太费劲了,于是用了DxfReader的部分代码。这个DxfReader本身没问题,但是我截取之后就遇到问题了,具体出问题的代码是一个宏
const int MAX_NUMBER=30;
int a;
CString tr;
bool finded = false;
//定义读取strMarket标签
#define READ_MARKET(strMarket) \
if (!feof(fp) && !ferror(fp))\
\
tr.Empty();\
fscanf(fp, "%s\n", m_str);\
a++;\
while(strcmp(m_str, strMarket) != 0)\
\
fscanf(fp, "%s\n", m_str);\
a++;\

其中m_str是CString类型的,fp是个FILE指针,调用这个宏的命令是READ_MARKET_NEW("ENTITIES");,大概意思是从一个文件中找出ENTITIES字符串所在的位置。
但是我调用之后报了一个极其离奇的错误
DxfReaderDlg.obj : error LNK2005: "class ATL::CStringT<char,class StrTraitMFC_DLL<char,class ATL::ChTraitsCRT<char> > > tr" (?tr@@3V?$CStringT@DV?$StrTraitMFC_DLL@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@A) 已经在 ChildFrm.obj 中定义,出错的代码位置就是这个宏,怎么个意思呢。。。跪求大神解答T_T

之后,我觉得宏不太会用,于是仿写了个相似的函数
void CChildFrame::ReadMarket(CString strMarket,FILE *fp)

//定义读取strMarket标签
CString tr;
long int aa=0;
if (!feof(fp) && !ferror(fp))

tr.Empty();
fscanf(fp, "%s\n", m_str);
aa++;

while(strcmp(m_str, strMarket) != 0)

fscanf(fp, "%s\n", m_str);
aa++;



这个函数本身运行也没有问题,但是如果查找的文件很大,以至于aa加到了20000多,也会报个奇怪的问题
readertry.exe 中的 0x5d60d931 (mfc90d.dll) 处未处理的异常: 0xC0000005: 读取位置 0x30303030 时发生访问冲突
这个问题的报错地在VS自身的atlsimpstr.h页上,具体位置如下
void Release() throw()

ATLASSERT( nRefs != 0 );

if( _AtlInterlockedDecrement( &nRefs ) <= 0 )

pStringMgr->Free( this ); -----------------------报错在这里


但是如果遍历的文件相对较小,aa,也就是遍历的行数在1万左右,就不会有这个问题

到底是怎么回事啊啊啊。。。求大神帮忙看一下。。。两段代码能弄明白一段就行。。。我还可以追加加分啊啊啊啊啊

第二个已经很明显了,是CString出错的,介意不用用CString,直接用一个动态数组,CString用不好好容易出奇怪的错误 参考技术A 这条路走不通,不要继续较劲了。去网上多找找,有读取DXF的代码可以借鉴的。

用vc++,如何读出设备信息,入cpu,内存,分区,各个分区的剩余空间等?

虚拟内存
内存在计算机中的作用很大,电脑中所有运行的程序都需要经过内存来执行,如果执行的程序很大或很多,就会导致内存消耗殆尽。为了解决这个问题,Windows中运用了虚拟内存技术,即拿出一部分硬盘空间来充当内存使用,当内存占用完时,电脑就会自动调用硬盘来充当内存,以缓解内存的紧张。举一个例子来说,如果电脑只有128MB物理内存的话,当读取一个容量为200MB的文件时,就必须要用到比较大的虚拟内存,文件被内存读取之后就会先储存到虚拟内存,等待内存把文件全部储存到虚拟内存之后,跟着就会把虚拟内里储存的文件释放到原来的安装目录里了。下面,就让我们一起来看看如何对虚拟内存进行设置吧。
虚拟内存的设置
对于虚拟内存主要设置两点,即内存大小和分页位置,内存大小就是设置虚拟内存最小为多少和最大为多少;而分页位置则是设置虚拟内存应使用那个分区中的硬盘空间。对于内存大小的设置,如何得到最小值和最大值呢?你可以通过下面的方法获得:选择“开始→程序→附件→系统工具→系统监视器”(如果系统工具中没有,可以通过“添加/删除程序”中的Windows安装程序进行安装)打开系统监视器,然后选择“编辑→添加项目”,在“类型”项中选择“内存管理程序”,在右侧的列表选择“交换文件大小”。这样随着你的操作,会显示出交换文件值的波动情况,你可以把经常要使用到的程序打开,然后对它们进行使用,这时查看一下系统监视器中的表现值,由于用户每次使用电脑时的情况都不尽相同,因此,最好能够通过较长时间对交换文件进行监视来找出最符合您的交换文件的数值,这样才能保证系统性能稳定以及保持在最佳的状态。
找出最合适的范围值后,在设置虚拟内存时,用鼠标右键点击“我的电脑”,选择“属性”,弹出系统属性窗口,选择“性能”标签,点击下面“虚拟内存”按钮,弹出虚拟内存设置窗口,点击“用户自己指定虚拟内存设置”单选按钮,“硬盘”选较大剩余空间的分区,然后在“最小值”和“最大值”文本框中输入合适的范围值。如果您感觉使用系统监视器来获得最大和最小值有些麻烦的话,这里完全可以选择“让Windows管理虚拟内存设置”。
调整分页位置
Windows 9x的虚拟内存分页位置,其实就是保存在C盘根目录下的一个虚拟内存文件(也称为交换文件)Win386.swp,它的存放位置可以是任何一个分区,如果系统盘C容量有限,我们可以把Win386.swp调到别的分区中,方法是在记事本中打开System.ini(C:\Windows下)文件,在[386Enh]小节中,将“PagingDrive=C:WindowsWin386.swp”,改为其他分区的路径,如将交换文件放在D:中,则改为“PagingDrive=D:Win386.swp”,如没有上述语句可以直接键入即可。
而对于使用Windows 2000和Windows XP的,可以选择“控制面板→系统→高级→性能”中的“设置→高级→更改”,打开虚拟内存设置窗口,在驱动器[卷标]中默认选择的是系统所在的分区,如果想更改到其他分区中,首先要把原先的分区设置为无分页文件,然后再选择其他分区。
或者,WinXP一般要求物理内存在256M以上。如果你喜欢玩大型3D游戏,而内存(包括显存)又不够大,系统会经常提示说虚拟内存不够,系统会自动调整(虚拟内存设置为系统管理)。
如果你的硬盘空间够大,你也可以自己设置虚拟内存,具体步骤如下:右键单击“我的电脑”→属性→高级→性能 设置→高级→虚拟内存 更改→选择虚拟内存(页面文件)存放的分区→自定义大小→确定最大值和最小值→设置。一般来说,虚拟内存为物理内存的1.5倍,稍大一点也可以,如果你不想虚拟内存频繁改动,可以将最大值和最小值设置为一样。

44》虚拟内存使用技巧
对于虚拟内存如何设置的问题,微软已经给我们提供了官方的解决办法,对于一般情况下,我们推荐采用如下的设置方法:
(1)在Windows系统所在分区设置页面文件,文件的大小由你对系统的设置决定。具体设置方法如下:打开"我的电脑"的"属性"设置窗口,切换到"高级"选项卡,在"启动和故障恢复"窗口的"写入调试信息"栏,如果你采用的是"无",则将页面文件大小设置为2MB左右,如果采用"核心内存存储"和"完全内存存储",则将页面文件值设置得大一些,跟物理内存差不多就可以了。
小提示:对于系统分区是否设置页面文件,这里有一个矛盾:如果设置,则系统有可能会频繁读取这部分页面文件,从而加大系统盘所在磁道的负荷,但如果不设置,当系统出现蓝屏死机(特别是STOP错误)的时候,无法创建转储文件 (Memory.dmp),从而无法进行程序调试和错误报告了。所以折中的办法是在系统盘设置较小的页面文件,只要够用就行了。
(2)单独建立一个空白分区,在该分区设置虚拟内存,其最小值设置为物理内存的1.5倍,最大值设置为物理内存的3倍,该分区专门用来存储页面文件,不要再存放其它任何文件。之所以单独划分一个分区用来设置虚拟内存,主要是基于两点考虑:其一,由于该分区上没有其它文件,这样分区不会产生磁盘碎片,这样能保证页面文件的数据读写不受磁盘碎片的干扰;其二,按照Windows对内存的管理技术,Windows会优先使用不经常访问的分区上的
页面文件,这样也减少了读取系统盘里的页面文件的机会,减轻了系统盘的压力。
(3)其它硬盘分区不设置任何页面文件。当然,如果你有多个硬盘,则可以为每个硬盘都创建一个页面文件。当信息分布在多个页面文件上时,硬盘控制器可以同时在多个硬盘上执行读取和写入操作。这样系统性能将得到提高。
小提示:
允许设置的虚拟内存最小值为2MB,最大值不能超过当前硬盘的剩余空间值,同时也不能超过32位操作系统的内存寻址范围——4GB
参考技术A //获取当前物理内存和虚拟内存的使用情况
MEMORYSTATUS memstatus;
GlobalMemoryStatus(&memstatus);

//获取磁盘信息
GetDishFreeSpaceEx()
GetDriveType()//获取磁盘类型
GetVolumeInformation//获取卷标信息
CPU不懂本回答被提问者采纳

以上是关于用VC读取DXF文件,用了DxfReader的部分代码,结果出问题了,求解释啊的主要内容,如果未能解决你的问题,请参考以下文章

dxf文件读取

如何在 dxf 文件中表示/读取立方体?

dxf文件用啥打开

bigemap下载的kml文件用global mapper转成dxf后,用cad打开文字都是乱码?

用vc++,如何读出设备信息,入cpu,内存,分区,各个分区的剩余空间等?

c#读取dxf文件