fwrite写NUL

时间:2013-08-15 15:12:58

标签: php file fwrite nul

我正在尝试使用php写入一个文件,这是我正在使用的代码(从this answer转到我之前的问题):

$fp = fopen("counter.txt", "r+");

while(!flock($fp, LOCK_EX)) {  // acquire an exclusive lock
    // waiting to lock the file
}

$counter = intval(fread($fp, filesize("counter.txt")));
$counter++;

ftruncate($fp, 0);      // truncate file
fwrite($fp, $counter);  // set your data
fflush($fp);            // flush output before releasing the lock
flock($fp, LOCK_UN);    // release the lock

fclose($fp);

读取部分工作正常,如果文件被读取,则内容读取得很好,即如果文件包含2289,则读取2289

问题是,当它递增并重写该文件的值时,[NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL]1会被写入。

我缺少什么?为什么要写空字符?

3 个答案:

答案 0 :(得分:3)

你缺少的是倒带()。如果没有它,在截断为0字节后,指针仍然不在开头(reference)。因此,当您编写新值时,会在文件中使用NULL填充它。

此脚本将读取当前计数的文件(如果它不存在则创建),递增,并在每次加载页面时将其写回同一文件。

$filename = date('Y-m-d').".txt";

$fp = fopen($filename, "c+"); 
if (flock($fp, LOCK_EX)) {
    $number = intval(fread($fp, filesize($filename)));
    $number++;

    ftruncate($fp, 0);    // Clear the file
    rewind($fp);          // Move pointer to the beginning
    fwrite($fp, $number); // Write incremented number
    fflush($fp);          // Write any buffered output
    flock($fp, LOCK_UN);  // Unlock the file
}
fclose($fp);

答案 1 :(得分:1)

编辑#2:

尝试使用flock(测试)

如果文件未锁定,则会抛出异常(请参阅添加的行)if(...

我从 this accepted answer 借用了Exception片段。

<?php

$filename = "numbers.txt";
$filename = fopen($filename, 'a') or die("can't open file");

if (!flock($filename, LOCK_EX)) {
    throw new Exception(sprintf('Unable to obtain lock on file: %s', $filename));
}

file_put_contents('numbers.txt', ((int)file_get_contents('numbers.txt'))+1);

// To show the contents of the file, you 
// include("numbers.txt");

    fflush($filename);            // flush output before releasing the lock
    flock($filename, LOCK_UN);    // release the lock


fclose($filename);
echo file_get_contents('numbers.txt');

?>

答案 2 :(得分:0)

您可以使用此代码,简化版本,但不确定它是否是最好的:

<?php
$fr = fopen("count.txt", "r");
$text = fread($fr, filesize("count.txt"));
$fw = fopen("count.txt", "w");
$text++;
fwrite($fw, $text);
?>