【发布时间】:2011-11-06 19:22:21
【问题描述】:
首先是我的代码:
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
再一次,当我在没有第一个程序的情况下自己启动它时,它可以工作。
我有点困惑,但现在可以了。可能是我的系统有问题,我不知道。但是感谢您的所有回答。
【问题讨论】:
-
szRETURN 在调用此函数之前是否已清零?否则 strcat 将寻找附加到未初始化的字符串,结果显然是未定义的。
-
生成另一个进程并等待它完成的代码在哪里? (此外,您的 RecvPaths 永远不会删除 szFILE ,因此它会泄漏内存。)
-
您最好使用
while(!feof(hFILE)) { ... }构造来读取文件,因为您可以在打开文件后立即获得1 == feof()。
标签: c file fopen autoit createprocess