Pour un devoir particulier, j'implémente un système de stockage de données de base utilisant des fichiers séquentiels sous la norme C, qui ne peut pas charger plus d'un enregistrement à la fois. Ainsi, la partie de base crée un nouveau fichier où les résultats de tout ce que nous faisons avec les enregistrements originaux sont stockés. Le fichier précédent est renommé et un nouveau sous le nom de travail est créé. Le code est compilé avec MinGW 5.1.6 sur Windows 7.stdio's remove() ne supprime pas toujours à l'heure
Le problème est, cette version particulière du code (j'ai des versions presque identiques de ce flottant autour de mes fonctions) ne supprime pas toujours l'ancien fichier, donc le renommage échoue et donc les données stockées sont effacées par le fopen().
FILE *archivo, *antiguo;
remove("IndiceNecesidades.old"); // This randomly fails to work in time.
rename("IndiceNecesidades.dat", "IndiceNecesidades.old"); // So rename() fails.
antiguo = fopen("IndiceNecesidades.old", "rb");
// But apparently it still gets deleted, since this turns out null (and I never find the .old in my working folder after the program's done).
archivo = fopen("IndiceNecesidades.dat", "wb"); // And here the data gets wiped.
En fait, chaque fois que le .old existe déjà, il y a une chance qu'il est pas retiré à temps pour le changement de nom() pour prendre effet avec succès. Aucun nom possible n'est en conflit à la fois interne et externe.
La chose étrange est que c'est seulement avec ce fichier particulier. Les snippets identiques à l'exception du nom changé en Necesidades.dat (qui se produit dans 3 fonctions différentes) fonctionnent parfaitement.
// I'm yet to see this snippet fail.
FILE *antiguo, *archivo;
remove("Necesidades.old");
rename("Necesidades.dat", "Necesidades.old");
antiguo = fopen("Necesidades.old", "rb");
archivo = fopen("Necesidades.dat", "wb");
Toutes les idées sur pourquoi cela se produit, et/ou comment puis-je assurer la commande remove() a pris effet par le changement de nom de temps() est exécutée? (Je pensais juste utiliser une boucle while pour forcer l'appel remove() tant que fopen() renvoie un pointeur non nul, mais cela ressemble à un plantage dû au débordement de l'OS avec des demandes de suppression ou quelque chose.)
Vérifiez-vous la valeur de retour de remove? Et avez-vous toujours le fichier ouvert lorsque vous essayez de le supprimer? – Cascabel
Supprimer montre pas de problèmes (et en fait supprime le fichier, juste le fait trop tard), Rename se révèle "Permission Denied" (qui est parce que .old existe toujours, vérifié cela avec un test fopen()). Impossible d'ouvrir le fichier. – Kyte
Ouais, je pensais que vous n'aviez pas oublié quelque chose d'aussi évident, mais ça valait le coup. – Cascabel