fermer le fichier avec la fonction fclose() mais le dossier toujours en cours d'utilisation

J'ai un problème avec la suppression de/l'écrasement d'un fichier à l'aide de mon programme qui est également utilisée(lire) par mon programme. Le problème semble être que, en raison du fait de mon programme est de la lecture des données à partir du fichier (output.txt) il met le fichier dans un " dans l'utilisation de l'état qui fait qu'il est impossible de supprimer ou de remplacer le fichier.

Je ne comprends pas pourquoi le fichier reste "en utilisation" parce que je ferme le fichier après utilisation avec la fonction fclose();

c'est mon code:

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
  }
}

- Je utiliser la fonction fclose() pour fermer le fichier, mais le fichier reste en cours d'utilisation par mon programme jusqu'à ce que mon programme est totalement arrêté.

Quelle est la solution pour libérer le fichier de sorte qu'il peut être supprimé ou écrasé?

En réalité, mon code n'est pas une boucle sans fin ; )

Merci d'avance!

Marco

Mise à jour

Comme demander à une partie de mon code qui génère le fichier 'dans'. Ce n'est pas une boucle, et cette fonction est appelée depuis la fonction main();

Voici un morceau de code:

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);

}

La boucle while traite le fichier. L'output.txt contient des jeux de 9 variables, le nombre de jeux est inconnue, mais toujours dans des ensembles de 9.

output.txt pourrait contenir par exemple: 0,1,2,3,4,5,6,7,8,8,7,6,5,4,1,2,3,0

mise à jour 2

code:

    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
    }
}

désolé pour l'utilisation de pré à nouveau, mais je n'ai pas la mise en forme de ce site 🙁

Utilisez-vous strerror/perror pour obtenir un diagnostic de ce qui s'est passé? Quel système d'exploitation êtes-vous?
Avez-vous déjà essayé de fflush() le fichier avant de fclose()ing?
ce n'est pas nécessaire, flcose() prendra soin de cela. @Marco, comme @Henno Brandsma dit, inspecter les errno et voir ce qu'il dit, cela peut vous donner quelques indices. Sur une note de côté, c'est marqué, C++, pourquoi n'êtes-vous pas à l'aide de IO flux??
Il faut toujours vérifier fclose() valeur de retour.
Comme il est de la lecture du fichier, y aurait-il un besoin d'appeler fflush de toute façon?

OriginalL'auteur Marco | 2011-01-12