fopen 在调用之前打开文件 [关闭]
Posted
技术标签:
【中文标题】fopen 在调用之前打开文件 [关闭]【英文标题】:fopen opens File before calling it [closed] 【发布时间】: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()
。
【参考方案1】:
您将相对路径传递给 fopen(),因此它可能会在您不期望的另一个文件夹中打开文件,因为调用进程的工作目录可以动态更改。打开文件时始终使用绝对路径。
【讨论】:
没有。我的问题不是它没有读入我的编。我的问题是,当我从我的 prog 调用第二个 prog 时,第二个不会将任何内容写入文件。如果我从资源管理器运行它,第二个程序就完美了。如果我将 fopen 中的路径更改为新文件,第二个 prog 会将其完美地写入旧文件。 那么您确定您的第二个程序(可能是在这里发布的一个想法)没有在其他文件夹中打开文件吗?您是否在硬盘上搜索了所有名为 FLM.tmp 的文件?当您在没有路径的情况下打开时,工作文件夹可能与答案所示不同。调用第二个程序后文件上的时间戳是多少?变了吗? @Shadowigor 可能在等待您的程序完成的代码中有错误 - 您最终在该程序完成之前调用了 RecvPaths。 不,我也检查过。这不是问题。 转到 sysinternals.com 并下载 FileMon 实用程序。它允许您实时查看文件 I/O 活动,因此您可以准确查看两个应用程序在做什么、它们正在访问哪些路径、正在写入和读取哪些文件的数据量等。【参考方案2】:一些cmets:
(1) 你有一个内存泄漏 - 你永远不会删除 szFILE。
(2) 你应该指定一个最大尺寸作为函数的附加参数,这样就不会发生意外的内存覆盖
RecvPaths( char* szRETURN, size_t maxLength )
(3) 函数的末尾不需要有一个空的return;
,因为方法被声明为返回void。
(4) 您应该验证其他程序/进程是否正确关闭了文件,如果文件仍然打开,则可能会导致您的问题,因为文件内容可能尚未刷新到磁盘。
(5) 在 Windows 中,推荐的处理文件 IO 的方法是使用 Windows 特定的方法,例如CreateFile() 可以处理诸如 windows 文件权限之类的事情,并在发生错误时为您提供更具描述性的错误消息。
【讨论】:
好的。 1到3我明白。关于 4:是的,它正在关闭它。但是在 5:我不太了解这些功能。可以举个例子吗? msdn.microsoft.com/en-us/library/windows/desktop/…以上是关于fopen 在调用之前打开文件 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章