程序出错的问题
最近在看UNIX环境下的 高级编程,在书的56页有这样一个程序
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
int main(int argc,char** argv)
{
int i;
struct stat buf;
char* ptr;
for (i=1;i < argc ;++i)
{
printf( "%s: ",argv[i]);
if ( lstat(argv[i],&buf) < 0 )
{
printf( "lstat error.\n ");
continue;
}
if (S_ISREG(buf.st_mode)) ptr= "regular ";
else if (S_ISDIR(buf.st_mode)) ptr= "directory ";
else if (S_ISCHR(buf.st_mode)) ptr= "character special ";
else if (S_ISBLK(buf.st_mode)) ptr= "block special ";
else if (S_ISFIFO(buf.st_mode)) ptr= "fifo ";
#ifdef S_ISLNK
else if (S_ISLNK(buf.st_mode)) ptr= "symbolic link ";
#endif
#ifdef S_ISSOCK
else if (S_ISSOCK(buf.st_mode)) ptr= "socket ";
#endif
else ptr= "** unknown mode ** ";
printf( "%s\n ",ptr);
}
exit(0);
}
~
本人改些了一 下 ,程序如下
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
int main(int argc,char** argv)
{
int i;
struct stat buf;
char* ptr;
for( i=1; i < argc;++i)
{
printf( "%s: ",argv[i]);
if ( lstat(argv[i],&buf) == -1 )
{
printf( "lstat error.\n ");
continue;
}
switch(buf.st_mode)
{
case 'S_ISREG ': ptr= "regular "; break;
case 'S_ISDIR ': ptr= "directory "; break;
case 'S_ISCHR ': ptr= "character special "; break;
case 'S_ISBLK ': ptr= "block special "; break;
case 'S_ISFIFO ': ptr= "fifo "; break;
case 'S_ISLNK ': ptr= "symbolic "; break;
case 'S_ISSOCK ': ptr= "socket "; break;
default: ptr= "** unknown mode ** ";
}
printf( "%s\n ",ptr);
}
exit(0);
}
发现运行结果就不一样了,不知道我的程序错在哪儿,请高手指点一下,谢谢.
[解决办法]
你好象弄错了概念,你看看《UNIX环境下的 高级编程》第55页最后
S_ISREG、S_ISDIR……等不是一般函数返回的信息代码,它们是 <sys/stat.h> 文件里定义的宏,可以说是需要buf.st_mode做参数的函数。
人家书上的一串IF语句是在的对S_ISREG()、S_ISDIR()……函数的返回值做判断,不能转换成你的这个switch语句吧
[解决办法]
if (S_ISREG(buf.st_mode)) ptr= "regular ";
if (buf.st_mode == 'S_ISREG ') ptr= "regular ";
两个完全不同的结果