用fclose()关闭文件,但文件仍在使用中

时间:2011-01-12 08:51:12

标签: c++ file-io fclose

我在使用我的程序正在使用(读取)程序删除/覆盖文件时出现问题。问题似乎是因为我的程序正在从文件(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,但我没有得到这个网站的格式:(

5 个答案:

答案 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两次会发生什么?这可能是问题的原因吗?

在这个想法中,我建议再做两次检查。

  • printf all fopen / fclose call
  • 在fclose将文件变量重置为NULL后

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)