返回信息流今天调试代码,内容大致如下:
FILE *result=NULL;
sprintf(buf_com,"%s\\Cruise_Result.csv",name);
result = fopen(buf_com,"a+");
if(result == NULL)
{
return ERROR_NOT_OPEN_ERROR;
}
fprintf(result,"...");
chdir(Path);
...剩余操作...
fopen+fprintf+fclose
跑了一遍,csv文件没生成。
然后在开头fopen和fprintf处加断点,一步一步走,csv文件生成了。
然后把断点去了,又没生成。
反反复复好几遍,代码一行没改,就加了断点才能生成文件……
还得向各位请教。
这是一条镜像帖。来源:北邮人论坛 / cpp / #89224同步于 2015/10/28
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
【已解决】VS 同一代码加断点不加断点结果居然是不一样的。
wyliewylie
2015/10/28镜像同步6 回复
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
查了一下午,解决了,原因真是无语。
在fopen之前,用win下的接口WinExec调用"mkdir"创建文件夹。
关键这一步是异步的,mkdir没执行完,非常快的就调用了fopen,导致fopen找不到路径而失败。
只要给fopen前加一个微弱的延时就好了。
换GCC,你懂得。
【 在 wyliewylie 的大作中提到: 】
: 查了一下午,解决了,原因真是无语。
: 在fopen之前,用win下的接口WinExec调用"mkdir"创建文件夹。
: 关键这一步是异步的,mkdir没执行完,非常快的就调用了fopen,导致fopen找不到路径而失败。
: ...................
如果是windows API的话,何不用CreateDirectory函数呢?
WinExec的作用是执行一个命令,显然要创建另一个进程。这样的话,延迟也是错误的做法。操作系统随时有权让任何进程睡任意时间的觉。所以,进行线程、进程间的协调工作,不能靠定时,要靠“同步”。这包括锁、信号量、消息队列等。
况且WinExec是一个过时的函数,是为了和旧的16位程序兼容用的。所以,用CreateDirectory吧。
回暖神:
我初次在win环境下写c++。最后直接新建了工程编译了.exe粗暴解决。项目用的解密解压命令失传了,只能调用现成的exe。以往直接调system在linux里跑并等待其返回,但在win下会弹出cmd命令窗口,影响体验。所以才想着用WinExec,现在来看win下的编程还有很多漏洞。
谢暖神指点!
【 在 nuanyangyang 的大作中提到: 】
: 如果是windows API的话,何不用CreateDirectory函数呢?
: WinExec的作用是执行一个命令,显然要创建另一个进程。这样的话,延迟也是错误的做法。操作系统随时有权让任何进程睡任意时间的觉。所以,进行线程、进程间的协调工作,不能靠定时,要靠“同步”。这包括锁、信号量、消息队列等。
: 况且WinExec是一个过时的函数,是为了和旧的16位程序兼容用的。所以,用CreateDirectory吧。
【 在 wyliewylie 的大作中提到: 】
: 回暖神:
: 我初次在win环境下写c++。最后直接新建了工程编译了.exe粗暴解决。项目用的解密解压命令失传了,只能调用现成的exe。以往直接调system在linux里跑并等待其返回,但在win下会弹出cmd命令窗口,影响体验。所以才想着用WinExec,现在来看win下的编程还有很多漏洞。
: 谢暖神指点!
linux上也有mkdir系统调用啊。。。
上边这段代码是跑在win上的,缺点是system("mkdir ...")会弹出cmd命令,我当时不知道有CreateDirectory,才转而用WinExec的。
【 在 nuanyangyang 的大作中提到: 】
:
: linux上也有mkdir系统调用啊。。。