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 🙁
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
Vous devez vous connecter pour publier un commentaire.
Sera-ce en raison de l'espace disque maximal a été atteint et il y a encore des données dans le fichier
flux de tampon; fclose avec un fichier de flux bouffées de chaleur (écrit toutes les données dans la mémoire tampon), l'opération d'écriture échoue, car l'espace disque maximal est atteint.
Je vous suggère de portée le problème, en appelant la fonction fclose() directement après fopen().
Si le succès, puis quelque chose qui cloche dans le code entre la fonction fclose() et fopen().
Concernant l'espace disque, il y a beaucoup (34GB); c'est une bonne, je vais essayer la fonction fclose() directement après fopen();
la fonction fclose() directement après fopen() les résultats dans le même problème, rien de mal avec mon code entre les deux.
alors que ma réponse a suggéré, le programme de génération de
output.txt
n'a probablement pas fini.Je pense que c'est fini, parce que quand je lance le programme manuellement, sans l'utilisation de mon programme, et de le laisser fonctionner dès que l'output.txt est générée j'pouvez manuellement modifier/supprimer. Si cela est encore possible, ALORS que le programme est en cours d'exécution. Il s'agit vraiment de flcose/fopen
OriginalL'auteur wengseng
Le fichier pourrait encore être en cours d'utilisation par le CRT ou OS - par exemple, les OS peuvent amortir les écritures sur le disque. fflush() ne chasse CRT tampons, pas OS tampons.
Qui seraient spécifiques aux systèmes d'exploitation.
OriginalL'auteur Puppy
Il y a probablement d'autres endroits dans votre code où vous ne l'appelez pas
fclose
, de fuite le fichier. Même dans ce code, si une erreur se produit entre fopen et fclose (ou une instruction de retour, ou une instruction continue, etc...) vous aurez des fuites, les fichier. S'il vous plaît, passer à l'idiome RAII.Edit: dans votre code:
et de remplacer chaque
avec:
Nous dire si c'est utile;
"J'ai vérifié mon code, mais chaque fois que j'ouvre le fichier, j'ai aussi fermer" C'est une très naïve déclaration. voir RAII ou tout bon C++ livre. en gros, passer à std::fstream.
RAII est synonyme de Rressource Unacquisition par ces derniers IIinitalization. Cela signifie essentiellement que si vous avez un objet qui a des ressources, de la construction, il est assez à l'utilisation de ces ressources. Par conséquent, ybungalobill la suggestion de l'utilisation de
std::fstream
.Je vais mettre en œuvre votre code et de donner une réponse : )
Il se compile sans erreur, mais lorsque je lance l'exécutable compilé il donne l'erreur suivante: Debug assertion faild! avec un chemin d'accès à la fonction fclose.c. Expression: (stream != NULL). Cela a quelque chose à voir avec l'int fclose() nous déclarer?
OriginalL'auteur ybungalobill
Juste un coup de feu dans l'obscurité ici...
Ce qui est à l'intérieur de
runProgram()
? Fait que la fonction d'attendre jusqu'à ce que le programme est terminé, avant de revenir? Je me demande si le programme qui est écrit les données sont, en fait, toujours en cours... il est difficile de dire à partir d'ici, mais pensé que je jetterais!tout simplement parce que le fichier existe ne signifie pas qu'il est fermé ou que le programme a fini de s'exécuter...
Bien entendu, le fichier existe pas ainsi que vous l'ouvrez donc la première fois que vous exécutez ShellExecute() du programme pour générer le fichier le fichier est là pour vous. Dès que vous commencez à lire, l'écriture du programme est encore en exploitation. Probablement le programme de lecture de frappe à la fin du fichier pendant qu'il est encore utilisé par le programme, vous appeler si vous ne pouvez pas le supprimer. Essayez ce qui suit: a) le programme crée le output.txt fichier s'ouvre 'o.txt fichier et écrire. b) quand le programme se termine, à proximité de la 'o.txt fichier et le renommer en "output.txt'. c) Maintenant, vous programme de lecture de shoul ont pas de problème pour l'enlever!
J'ai déjà essayé quelque chose comme ça. Dans ce cas, il n'est pas le programme qui génère output.txt qui la tient occupée, c'est mon propre programme et d'être cause par fopen() & fclose(). Voir les commentaires @wengseng
OriginalL'auteur Moo-Juice
Après la lecture de toutes les réponses et les commentaires, je ne pouvais pas penser à une raison quelconque de l'OP du problème.
Est-ce multi-thread ou réentrant routine?
Ce qui va se passer si fopen deux fois et fclose deux fois sur le même fichier? Est ce qui pourrait être la cause du problème?
Dans cette pensée, je suggère deux plus de vérifications.
f = fopen("", ""); printf("fopen => %p", f);
fclose(f); printf("fclose => %p", f); f = 0;
Si vous êtes gênant avec printf débogage, vous pouvez utiliser OutputDebugString.
extern void __stdcall OutputDebugStringA(const char*)
(MS VC seulement)OriginalL'auteur 9dan