Для конкретной части домашнего задания я внедряю базовую систему хранения данных с использованием последовательных файлов по стандарту C, которая не может загружать более 1 записи за раз. Итак, основная часть - создание нового файла, в котором сохраняются результаты всего, что мы делаем с исходными записями. Предыдущий файл переименовывается, и создается новый под рабочим именем. Код скомпилирован с MinGW 5.1.6 на Windows 7.
Проблема в том, что эта конкретная версия кода (у меня есть почти идентичные версии этого, плавающего вокруг моих функций), не всегда удаляет старый файл, поэтому переименование завершается неудачно, и, следовательно, сохраненные данные стираются Еореп ().
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.
По сути, всякий раз, когда ранее существовал .old, есть вероятность, что он не будет удален вовремя, чтобы переименование () вступило в силу. Нет возможных конфликтов имен как внутри, так и снаружи.
Странно то, что это только с этим конкретным файлом. Идентичные фрагменты, за исключением имени, измененного на Necesidades.dat (которые выполняются в 3 различных функциях), работают отлично.
// 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");
Любые идеи о том, почему это произошло, и / или как я могу убедиться, что команда remove () вступила в силу ко времени выполнения rename ()? (Я думал о том, чтобы просто использовать цикл while для принудительного вызова call remove () еще раз, если только fopen () возвращает ненулевой указатель, но это звучит как просьба о сбое из-за переполнения ОС запросами на удаление или чем-то еще.)