Code our life 日日行,不怕千万里;时时学,不怕千万卷

28六/100

低版本的pathinfo不返回filename

客戶反映系統有一個奇怪的問題,調試之後發現在5.1x(客戶使用5.1.x,我們開發使用5.2.x)的php pathinfo不返回 filename。只好棄用pathinfo函數。
之前使用pathinfo函數是想獲得文件的 文件名和擴展名,改用如下方法:

    // $filePath = '/var/www/image/xxxx.png';
    list($filename, $ext) = explode('.', basename($filePath));

當然,這樣寫是有一定的局限性,當文件名是"foo.bar.png"時,這樣寫就發生錯誤。不過正式程式中的$filePath是程序生成的,所以能控制文件名,不會發生這樣的情況,就放心使用。

8六/100

php中clearstatcache function

定义和用法

clearstatcache() 函数清除文件状态缓存。

clearstatcache() 函数会缓存某些函数的返回信息,以便提供更高的性能。但是有时候,比如在一个脚本中多次检查同一个文件,而该文件在此脚本执行期间有被删除或修改的危险 时,你需要清除文件状态缓存,以便获得正确的结果。要做到这一点,就需要使用 clearstatcache() 函数。

会进行缓存的函数,即受 clearstatcache() 函数影响的函数:

  • stat()
  • lstat()
  • file_exists()
  • is_writable()
  • is_readable()
  • is_executable()
  • is_file()
  • is_dir()
  • is_link()
  • filectime()
  • fileatime()
  • filemtime()
  • fileinode()
  • filegroup()
  • fileowner()
  • filesize()
  • filetype()
  • fileperms()

下面举个例子说明:

<?php
//检查文件大小
echo filesize("filesize.txt"),"<br/>"; //假设文件大小为123456,此时输出123456
 
$file = fopen("filesize.txt", "a+");
 
// 截取文件
ftruncate($file,100);
fclose($file);
echo filesize("filesize.txt"), "<br/>"; //输出的是缓存的结果,仍是123456
//清除缓存并再次检查文件大小
clearstatcache();
echo filesize("filesize.txt"), "<br/>"; // 因为清空的缓存,输出更新后的结果100
3六/100

自己对C中putchar函数的理解

重新阅读《C程序设计语言》一书,第一章有一个getchar()函数的例子,代码如下:

while( (c=getchar()) != EOF ) {
    putchar(c);
}

琢磨了一下才发现原来自己并没有完全理解getchar函数的原理(执行流程)。搜索相关资料后清楚了许多。记录自己的理解:
第一次调用getchar函数后,程序会等待用户的输入,这时候用户输入的所有字符(除了回车或其它退出程序的操作)都会保存在缓冲区中,当用户输入回车之后,就会将缓冲区中的第一个字符返回(例子中是将返回值赋予变量c)。当再次调用getchar(while循环中多次调用)的时候,就会读取缓冲区中的第二个字符并返回(再次赋予变量c),直至缓冲区中的字符读取完毕后,如果在次调用getchar,就会继续等地啊用户输入。也就是说,如果只调用一次getchar(),永远指向缓冲区的第一个字符:

//case 1:
c = getchar(); //如果用户输入 "abc"
putchar(c);// output 第一个字符'a'
putchar(c);// 还是output 第一个字符'a'
putchar(c);// 仍然output 第一个字符'b'
 
// case 2:
c = getchar(); //如果用户输入 "abc",将会把输入的字符串存放在缓冲区中,并返回第一个字符“a”给变量c
putchar(c);    // output "a"
c = getchar(); // 向缓冲区中读取第二个字符(即"b")并返回给变量c
...//如此类推

以上是个人的理解:)。下面附上网上搜索的参考资料(摘选):
来自:http://blog.csdn.net/oopDesigner/archive/2008/11/20/3341799.aspx

getchar有一个int型的返回值.当程序调用getchar时.程序就等着用户按键.用户输入的字符被存放在键盘缓冲区中.直到用户按回车为止(回车字符也放在缓冲区中).当用户键入回车之后,getchar才开始从stdin流中每次读入一个字符.getchar函数的返回值是用户输入的第一个字符的ASCII码,如出错返回-1,且将用户输入的字符回显到屏幕.如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取.也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完为后,才等待用户按键.
  getch与getchar基本功能相同,差别是getch直接从键盘获取键值,不等待用户按回车,只要用户按一个键,getch就立刻返回, getch返回值是用户输入的ASCII码,出错返回-1.输入的字符不会回显在屏幕上.getch函数常用于程序调试中,在调试时,在关键位置显示有关的结果以待查看,然后用getch函数暂停程序运行,当按任意键后程序继续运行.