首先是我的代码:
void RecvPaths(char *szRETURN)
{
FILE *hFILE;
char *szFILE = new char[2048];
hFILE = fopen("FLM.tmp", "r");
do
{
fgets(szFILE, 2048, hFILE);
strcat(szRETURN, szFILE);
} while(!feof(hFILE));
fclose(hFILE);
return;
}
现在我的问题:
我启动包含此功能的程序。它使用CreateProcess
创建一个新流程。这种方式调用的程序应该将一些数据写入" FLM.tmp"。完成后,我调用此函数来读取由其他程序写入的数据。但它总是一无所获。我还用Windows资源管理器打开了文件,但也没有。所以我检查了其他程序,这肯定是有效的。接下来,我尝试更改此函数中fopen
的路径,让其他程序中的路径保持不变,现在将其数据写入" FLM.tmp"。就像我的prog在开始新进程之前打开这个文件并且它阻止了它。但我从来没有在我的编程的另一部分打开这个文件。有谁知道什么可以解决这个问题?
编辑:好的,有些人想要第二个程序的代码。这里是。 (它是用AutoIt编写的):
#include <File.au3>
#include <Array.au3>
Local $aFilelist, $sFilelist, $i, $hFile
$hFile = FileOpen(@ScriptDir & "\FLM.tmp", 2)
If $CmdLine[0] = 0 Then
$aFilelist = DriveGetDrive("ALL")
Else
For $i = 2 To $CmdLine[0]
$CmdLine[1] = $CmdLine[1] & " " & $CmdLine[$i]
Next
$aFilelist = _FileListToArray($CmdLine)
EndIf
_ArrayDelete($aFilelist, 0)
$sFilelist = _ArrayToString($aFilelist, @CRLF)
FileWrite($hFile, $sFilelist)
FileClose($hFile)
Exit
而且,当我在没有第一个程序的情况下自己启动时,它就可以了。
我有点困惑,但现在它有效。也许这是我系统的一个问题,我不知道。但是,谢谢你的所有答案。
答案 0 :(得分:1)
您正在传递fopen()的相对路径,因此它可能正在打开您不期望的另一个文件夹中的文件,因为调用进程的工作目录可以动态更改。打开文件时始终使用绝对路径。
答案 1 :(得分:0)
一些评论:
(1)你有一个内存泄漏 - 你永远不会删除szFILE。
(2)你应该指定一个最大大小作为函数的附加参数,这样就不会有意外的内存覆盖
RecvPaths( char* szRETURN, size_t maxLength )
(3)因为声明方法返回void,所以函数末尾不需要空return;
。
(4)您应该验证其他程序/进程是否正确关闭文件,如果文件仍然打开,可能会导致您的问题,因为文件内容可能没有刷新到磁盘。
(5)在Windows中,处理文件IO的推荐方法是使用Windows特定的方法,例如: CreateFile()可以处理Windows文件权限等内容,并在发生错误时为您提供更具描述性的错误消息。