我在使用我的程序正在使用(读取)程序删除/覆盖文件时出现问题。问题似乎是因为我的程序正在从文件(output.txt)读取数据,它将文件置于“使用中”状态,这使得无法删除或覆盖该文件。
我不明白为什么文件保持“正在使用”,因为我在使用fclose()之后关闭了文件;
这是我的代码:
bool bBool = true
while(bBool){
//Run myprogram.exe tot generate (a new) output.txt
//Create file pointer and open file
FILE* pInputFile = NULL;
pInputFile = fopen("output.txt", "r");
//
//then I do some reading using fscanf()
//
//And when I'm done reading I close the file using fclose()
fclose(pInputFile);
//The next step is deleting the output.txt
if( remove( "output.txt" ) == -1 ){
//ERROR
}else{
//Succesfull
}
}
我使用fclose()来关闭文件,但我的程序仍在使用该文件,直到我的程序完全关闭。
解冻文件的解决方案是什么,可以删除/覆盖?
实际上我的代码不是没有结束的循环; )
提前致谢!
马
更新
请问我的代码的一部分也会生成“正在使用”的文件。这不是循环,而是从main();
调用此函数这是一段代码:
int iShapeNr = 0;
void firstRun()
{
//Run program that generates output.txt
runProgram();
//Open Shape data file
FILE* pInputFile = NULL;
int iNumber = 0;
pInputFile = fopen("output.txt", "r");
//Put all orientations of al detected shapes in an array
int iShapeNr = 0;
int iRotationBuffer[1024];//1024 is maximum detectable shapes, can be changed in RoboRealm
int iXMinBuffer[1024];
int iXMaxBuffer[1024];
int iYMinBuffer[1024];
int iYMaxBuffer[1024];
while(feof(pInputFile) == 0){
for(int i=0;i<9;i++){
fscanf(pInputFile, "%d", &iNumber);
fscanf(pInputFile, ",");
if(i == 1) {
iRotationBuffer[iShapeNr] = iNumber;
}
if(i == 3){//xmin
iXMinBuffer[iShapeNr] = iNumber;
}
if(i == 4){//xmax
iXMaxBuffer[iShapeNr] = iNumber;
}
if(i == 5){//ymin
iYMinBuffer[iShapeNr] = iNumber;
}
if(i == 6){//ymax
iYMaxBuffer[iShapeNr] = iNumber;
}
}
iShapeNr++;
}
fflush(pInputFile);
fclose(pInputFile);
}
while循环解析文件。 output.txt包含9个变量的集合,集合的数量是未知的,但总是以9的集合。
output.txt可以包含例如:0,1,2,3,4,5,6,7,8,8,7,6,5,4,1,2,3,0
更新2
代码:
void runProgram(){
//Check if output.txt exists, if so delete it
if(fileExists("output.txt") == 1){
//Delete output.txt
if( remove( "output2.txt" ) == -1 ){
//errormessage
}else{
//succesfull
}
}
//start program
ShellExecute( NULL, TEXT("open"), TEXT("program.exe"), NULL, NULL, SW_SHOWMAXIMIZED);
while(fileExists("output.txt") == 0);
//Close program
int iCheck = system("taskkill /IM program.exe");
if(iCheck != 0){
//error could not shut down
}
}
抱歉再次使用pre,但我没有得到这个网站的格式:(
答案 0 :(得分:1)
是否由于已达到最大磁盘空间而且文件中仍有数据 流缓冲; fclose'ing文件流刷新它(将所有数据写入缓冲区),写入操作将失败,因为达到最大磁盘空间。
我建议您通过在fopen()之后直接调用fclose()来解决问题。 如果成功,那么fclose()和fopen()之间的代码就出错了。
答案 1 :(得分:0)
您的代码中可能还有其他地方没有调用fclose
,泄漏文件。即使在这段代码中,如果在fopen和fclose(或者return语句,或者continue语句等等)之间发生错误,你也会泄漏文件。请切换到RAII习语。
修改:将此信息包含在您的代码中:
struct PoorMansFile {
FILE *_file;
PoorMansFile(const char* str1, const char* str2) : _file(fopen(str1,str2)) {}
~PoorMansFile() { if(_file) fclose(_file); }
operator FILE*() const { return _file; }
};
int fclose(PoorMansFile& file)
{
if(!file)
return 0;
int t = fclose(file._file);
file._file = 0;
return t;
}
并替换每个
FILE* file = NULL;
file = fopen(str1, str2);
使用:
PoorMansFile file(str1, str2);
告诉我们它是否有帮助;
答案 2 :(得分:0)
CRT或操作系统仍然可以使用该文件 - 例如,操作系统可能会缓冲对磁盘的写入。 fflush()只会刷新CRT缓冲区,而不是OS缓冲区。
答案 3 :(得分:0)
在黑暗中只是一枪......
runProgram()
内有什么?该函数是否等到程序完成才返回?我想知道写数据的程序实际上是否还在运行......从这里很难说,但我想我会把它扔出去!
答案 4 :(得分:-1)
在阅读完所有答案和评论后,我想不出任何OP问题的原因。
这是多线程还是可重入的例程?
如果fopen两次并在同一个文件上fclose两次会发生什么?这可能是问题的原因吗?
在这个想法中,我建议再做两次检查。
f = fopen(“”,“”); printf(“fopen =&gt;%p”,f);
FCLOSE(F); printf(“fclose =&gt;%p”,f); f = 0;
如果您对printf调试不方便,可以使用OutputDebugString。
extern void __stdcall OutputDebugStringA(const char*)
(仅限MS VC)