VS2010下出现的Expression:(stream!=Null)问题

昨天在VS2010下写一些C++的实验小程序,一开始调试运行都没什么问题,但是在写完另外的一个函数之后就出现问题,程序在调试的时候没有什么问题,但是运行就会报下面的错误:

Debug assertion failed.

Program:xxxxxxxxx

Line xxx

Expression:(stream!=NULL)

一开始我以为是我刚加的那个函数有问题,注释之后发现问题依然存在,到网上查找了很多的资料,但是依然没有解决,浪费了不少时间,后面发现是一个很简单的问题,其实可能也不算是个问题。

原来是我第一个函数要用到的一个文件被我用其他的软件打开了,程序在这个路径下打不开所需要的文件,然后系统就会报错,在我关闭其他的软件,解除对该文件的占用之后,整个程序运行起来就没什么问题了。

虽然是个小问题,不知道的情况下还是不知所措的,所以就写下这篇博客,总结一下自己的错误,再把网上找到的一些类似问题也在这里说明一下。

首先发生这类错误大多是文件处理问题,Expression:(stream!=NULL)是告诉你你传入的参数是NULL。可能出现错误的地点就是在文件处理函数上面,像fopen(),fread(),fprintf()等地方。这个时候就应该去看看你打开文件流为什么失败,最好在fopen(),fread(),fprintf()等函数后面都加上检错处理,这样出现问题之后方便定位。

出现这个问题时,你可以将需要用到的文件放到你要直接执行的exe文件所在的文件夹里面试试。在VS2010里面点运行的时候程序运行的当前目录好像一般是在你源码所在的位置。这个位置和你exe文件所在目录是不一样的,exe文件所在的目录一般在工程文件里面的Debug或者Release文件夹下面,所以你在运行程序时,一定要确定你所用到文件没有被占用和文件位置在源码所在的路径行下(在VS2010下适用,其他工具未作实验)。

另一种方法是在源码中适用绝对路径。就是包含盘符的完整路径,但这不是个好办法,就是在更换文件的时候需要在源码中修改,这会很麻烦,工程脱离了你的运行环境就没用了。

最完美的解决方法是使用程序的命令行传入参数,但这个一般来说比较麻烦。但是如果是在windows里的话,有一个比较简单的方法。那就是将文件拖到exe文件上,然后这个exe就会以那个文件为参数执行。

以上的这些前提是程序使用的文件流没有被占用,否则打开文件时还会出现问题。


下面再说一点:

VS2010运行的路径并不是exe文件所在的路径,而是源码所在的文件夹下,程序运行所需要的文件都要拷贝到这个目录下,这样程序运行的时候就会自动找到所需要的文件作为参数。这应该算是VS(VC)的Bug,可是微软方面一直没有修改,虽然那样会很麻烦,但是和直接运行的效果一致。虽然Debug和Release调试的效果是一样的,但是和直接运行的效果就不同了。其实这样也不能算是一个Bug,微软可能考虑的是希望Debug和Release的运行路径应该一致吧,这只有微软自己知道了。


想要添加运行参数在VC6和VS20XX是不一样的

VC6:

工程、设置、Debug、工作目录。

VS20XX:

项目、属性、配置属性、调试、工作目录。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值