免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6371 | 回复: 19
打印 上一主题 下一主题

rename为什么不执行? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-01-21 14:56 |只看该作者 |倒序浏览
在Linux环境下编译的这个程序。功能是把某个目录里边文件名大写的字母,变成小写的。
请各位大侠看看,这个程序有什么问题?为什么rename没有执行?而且,每次运行a.out的时候,总有Segmentation fault
哪里溢出了?

#include <sys/types.h>;
#include <unistd.h>;
#include <stdio.h>;
#include <string.h>;
#include <ctype.h>;
#include <dirent.h>;
#include <linux/unistd.h>;

int main(int argc,char *argv[])
{
        const char oldfile[32]={NULL},newfile[32]={NULL};
        const char dirname[64]={};
        int i;
        DIR *dp;
        struct dirent *fn;

        dp=opendir("/home/gzhy/123";
        do
        {
                fn=readdir(dp);
                strcpy(oldfile,fn->;d_name);
                strcpy(newfile,fn->;d_name);
                i=0;
                while(newfile)
                {
                        if(newfile>;64 &amp;&amp; newfile<91)
                                newfile=newfile+32;
                        i++;
                }
                rename(oldfile,newfile);
        }while(fn);
        closedir(dp);
}

论坛徽章:
0
2 [报告]
发表于 2003-01-21 15:02 |只看该作者

rename为什么不执行?

内存操作有问题,可能是你定义的oldfile和newfile的数组小,你试试更改更大,可以分配512等等。

论坛徽章:
0
3 [报告]
发表于 2003-01-21 15:11 |只看该作者

rename为什么不执行?

[quote]原帖由 "zhanggz"]内存操作有问题,可能是你定义的oldfile和newfile的数组小,你试试更改更大,可以分配512等等。[/quote 发表:

不应该吧。文件名(包括扩展名)都是10个字符之内的。

还有,为什么rename没有执行?

论坛徽章:
0
4 [报告]
发表于 2003-01-21 15:19 |只看该作者

rename为什么不执行?

你在strcpy前加上初始化数组的函数例如:memset(oldfille, 0, sizeof(oldfile))
试试

论坛徽章:
0
5 [报告]
发表于 2003-01-21 15:41 |只看该作者

rename为什么不执行?

const char oldfile[32]={NULL},newfile[32]={NULL};
const char dirname[64]={};

这个定义有问题,你把数组定义成const,而且还初始化。
以后这个数组内容就不能在被更改了。你把const去掉就应该可以了

论坛徽章:
0
6 [报告]
发表于 2003-01-21 16:04 |只看该作者

rename为什么不执行?

原帖由 "zhanggz" 发表:
你在strcpy前加上初始化数组的函数例如:memset(oldfille, 0, sizeof(oldfile))
试试

尝试了,不管用。

原帖由 "liupch" 发表:

这个定义有问题,你把数组定义成const,而且还初始化。
以后这个数组内容就不能在被更改了。你把const去掉就应该可以了


这两个数组内容可以修改。strcpy以后,我printf看过了,结果没问题。while循环结束后,我也用printf看过了。数组内容也被修改了。似乎不是const问题吧。
而且,我就算是把const删除了,一样有Segmentation fault,rename函数一样不管用。

论坛徽章:
0
7 [报告]
发表于 2003-01-21 16:13 |只看该作者

rename为什么不执行?

那你先看一下你对这个路径("/home/gzhy/123"有没有读写权限。
对这下面的文件有没有读写权限。

感觉你的程序没问题,所以建议你查看一下权限。
另外我在Solaris下测试的,如果定义为const,是会被警告的

论坛徽章:
0
8 [报告]
发表于 2003-01-21 16:19 |只看该作者

rename为什么不执行?

len = strlen(name);
           dirp = opendir(".";
           while ((dp = readdir(dirp)) != NULL)
                   if (dp->;d_namlen == len &amp;&amp; !strcmp(dp->;d_name, name)) {
                           (void)closedir(dirp);
                           return FOUND;
                   }
           (void)closedir(dirp);
           return NOT_FOUND;

以上是我在man里找到的,你的第一while循环有问题,在读取了最后一个文件或目录后还读取了一次,你的退出循环的判断条件有问题,你试着用上面的例子来重新写就可以了。

论坛徽章:
0
9 [报告]
发表于 2003-01-21 16:22 |只看该作者

rename为什么不执行?

Segmentation fault 就是有关指针操作有问题,有许多情况可以出现这种错误,比如使用了非法的野指针,你就是使用了野指针了,fn在为NULL值时,你又使用了,所以就出现了这样的问题。

论坛徽章:
0
10 [报告]
发表于 2003-01-21 17:12 |只看该作者

rename为什么不执行?

原帖由 "liupch" 发表:
那你先看一下你对这个路径("/home/gzhy/123"有没有读写权限。
对这下面的文件有没有读写权限。

感觉你的程序没问题,所以建议你查看一下权限。
另外我在Solaris下测试的,如果定义为const,是会被警告的


对那个目录的权限绝对是有的。/home/gzhy是我的用户的默认目录。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP