закройте файл с помощью fclose (), но файл все еще используется - PullRequest
4 голосов
/ 12 января 2011

У меня проблема с удалением / перезаписью файла с помощью моей программы, которая также используется (читается) моей программой.Кажется, проблема в том, что из-за того, что моя программа читает данные из файла (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 ]

1 голос
/ 12 января 2011

Будет ли это из-за того, что было достигнуто максимальное дисковое пространство и в буфере файловых потоков все еще есть данные;fclose'ing файловый поток очищает его (записывает все данные в буфер), операция записи завершится неудачно, так как достигнуто максимальное дисковое пространство.

Я предлагаю вам уменьшить проблему, вызвав fclose () непосредственно после fopen ().Если это успешно, то что-то не так в коде между fclose () и fopen ().

0 голосов
/ 12 января 2011

После прочтения всех ответов и комментариев я не мог придумать ни одной причины проблемы ОП.

Это многопоточная или повторяющаяся процедура?

Что произойдет, если fopen дважды и fclose дважды в одном файле? Может ли это быть причиной проблемы?

В этой мысли я предлагаю еще две проверки.

  • printf all fopen / fclose call
  • после того, как fclose сбросит переменную файла в NULL

f = fopen ("", ""); printf ("fopen =>% p", f);
fclose (е); printf ("fclose =>% p", f); f = 0;

Если вам неудобна отладка printf, вы можете использовать OutputDebugString.

extern void __stdcall OutputDebugStringA(const char*) (только MS VC)

0 голосов
/ 12 января 2011

Просто выстрел в темноте ...

Что внутри runProgram()?Эта функция ожидает завершения программы, прежде чем вернуться?Интересно, если программа, которая записывает данные, на самом деле, все еще работает ... отсюда трудно сказать, но я подумала, что я ее там брошу!

0 голосов
/ 12 января 2011

Файл все еще может использоваться CRT или ОС - например, ОС может буферизовать записи на диск. fflush () будет очищать только буферы CRT, но не буферы ОС.

0 голосов
/ 12 января 2011

Возможно, в вашем коде есть другие места, где вы не звоните fclose, пропуская файл. Даже в этом коде, если возникает ошибка между fopen и fclose (или оператором return, или оператором продолжения и т. Д.), Вы утечете в файл. Пожалуйста, переключитесь на 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);

Скажите нам, если это поможет;

...