ftruncate() no vaciar mi archivo

tengo un archivo en el que escribo

<timestamp>hashedcertificate
<timestamp>hashedcertificate
<timestamp>hashedcertificate

(Etc.)

En una determinada solicitud, estoy leyendo todas las marcas de tiempo en una matriz y todas las cadenas hash en una matriz.

$valid = fopen("./valid", "r+");
if (!$valid) {
  log::Write("Could not open file. Exiting..", DEBUG);
  exit(1);
}
$isLocked = flock($valid, LOCK_EX);
while (!$isLocked)
  $isLocked = flock($valid, LOCK_EX);
while (!feof($valid)) {
  $pos_begin = strpos($line, "<");
  $pos_end = strpos($line, ">", $pos_begin);
  $timestamp = substr($line, $pos_begin+1, $pos_end - $pos_begin - 1);
  $timestamps[] = $timestamp;
  $storedCert = substr($line, $pos_end + 1);
  $storedCerts[] = $storedCert;
  log::Write(sprintf("Read: %s with timestamp %s", $storedCert, $timestamp), DEBUG);
  $line = fgets($valid);
}

Después de verificarlos (eliminar si la marca de tiempo es demasiado antigua), quiero volver a escribir los hashes válidos restantes en el archivo.

ftruncate($valid, 0);
$counter = 0;
foreach ($timestamps as $timestamp) {
  $toWrite = "<" . $timestamp . ">" . $storedCerts[$counter] . "\n";
  log::Write(sprintf("Writing: \n%s", $toWrite), DEBUG);
  fputs($valid, $toWrite);
  $counter += 1;
}
flock($valid, LOCK_UN);
fclose($valid);

Pero mi archivo siempre se ve así: (creo que después de ftruncate, porque cuando abro el archivo para agregar las marcas de tiempo + hash, lo hace sin cosas extrañas; solo cuando la lectura del archivo + elimina los elementos de la matriz + ftruncate + escribe de vuelta al archivo viene) (ignore el primer hash; lo cambié temporalmente a crc32 para que sea más corto):

^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@<1378903136>9f71fb266d96afa161c1e52e8b65031c08997bdb5f215f7d

<1378903666>b0e15296
<1378903671>6b4132b9
<1378903695>b0e15296

¿Qué estoy haciendo mal?

preguntado el 11 de septiembre de 13 a las 14:09

1 Respuestas

¿No debería hacer un rebobinado () después del truncado para restablecer el puntero al comienzo del archivo nuevamente?

Respondido el 11 de Septiembre de 13 a las 14:09

Eso fue todo, no lo sabía (principiante de PHP desde hace 2 semanas :)) ¡Muchas gracias! - tle

¡No hay problema! Encantado de ayudar - gran empollón de jengibre

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.