4

自分のプログラムでも使用 (読み取り) されているファイルを自分のプログラムを使用して削除/上書きする際に問題が発生しました。問題は、私のプログラムがファイル (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 を再度使用して申し訳ありませんが、このサイトのフォーマットがわかりません :(

4

5 に答える 5

1

コード内に を呼び出さない他の場所があり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);

それが役立つかどうか教えてください。

于 2011-01-12T09:08:30.410 に答える
1

最大ディスク容量に達し、ファイル ストリーム バッファにまだデータがあるためでしょうか。ファイル ストリームを fclose するとフラッシュされます (バッファ内のすべてのデータが書き込まれます)。最大ディスク領域に達するため、書き込み操作は失敗します。

fopen() の直後に fclose() を呼び出して、問題を絞り込むことをお勧めします。成功した場合は、fclose() と fopen() の間のコードに問題があります。

于 2011-01-12T09:43:46.163 に答える
0

ファイルは、CRT または OS によってまだ使用されている可能性があります。たとえば、OS がディスクへの書き込みをバッファリングする場合があります。fflush() は CRT バッファのみをフラッシュし、OS バッファはフラッシュしません。

于 2011-01-12T09:40:02.560 に答える
0

ここで暗闇の中でのショットだけ...

中身はrunProgram()?その関数は、プログラムが終了するまで待機してから戻りますか? データを書き込んでいるプログラムは、実際にまだ実行されているのだろうか...ここからはわかりにくいですが、そこに捨てようと思いました!

于 2011-01-12T09:54:45.307 に答える
-1

すべての回答とコメントを読んだ後、OPの問題の理由は考えられませんでした。

これはマルチスレッドまたは再入可能ルーチンですか?

同じファイルに対して fopen を 2 回実行し、fclose を 2 回実行するとどうなりますか? これが問題の原因である可能性がありますか?

この考えでは、さらに2つのチェックを提案します。

  • printf all fopen/fclose 呼び出し
  • fclose がファイル変数を NULL にリセットした後

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

printf のデバッグに不便な場合は、OutputDebugString を使用できます。

extern void __stdcall OutputDebugStringA(const char*)(MS VC のみ)

于 2011-01-12T11:44:10.410 に答える