title: stdio's remove() not always deleting on time
body: <p>For a particular piece of homework, I'm implementing a basic data storage system using sequential files under standard C, which cannot load more than 1 record at a time. So, the basic part is creating a new file where the results of whatever we do with the original records are stored. The previous file's renamed, and a new one under the working name is created. The code's compiled with MinGW 5.1.6 on Windows 7.</p>
  
  <p>Problem is, this particular version of the code (I've got nearly-identical versions of this floating around my functions) doesn't always remove the old file, so the rename fails and hence the stored data gets wiped by the fopen().</p>
  
  <pre><code>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.
  </code></pre>
  
  <p>Basically, anytime the .old previously exists, there's a chance it's not removed in time for the rename() to take effect successfully. No possible name conflicts both internally and externally.</p>
  
  <p>The weird thing's that it's only with this particular file. Identical snippets except with the name changed to Necesidades.dat (which happen in 3 different functions) work perfectly fine. </p>
  
  <pre><code>// 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");
  </code></pre>
  
  <p>Any ideas on why would this happen, and/or how can I ensure the remove() command has taken effect by the time rename() is executed? (I thought of just using a while loop to force call remove() again so long as fopen() returns a non-null pointer, but that sounds like begging for a crash due to overflowing the OS with delete requests or something.)</p>