LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1807|回复: 7

C编程,遇到奇怪的错误.求解,我感到奇怪到不知道如何下手

[复制链接]
发表于 2009-7-21 22:34:42 | 显示全部楼层 |阅读模式
题目是这样的:有时需要对整个目录作备份,修改cp1.c,使得当两个参数都是目录时,把第一个目录中的所有文件复制到第二个目录中.文件名不变.(unix/linux编程实践指南)
下面的是我写的.
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <dirent.h>
#include <sys/types.h>
#define BUFFERSIZE 4096

void oops(char *s1,char *s2);
int main(int ac,char *av[])
{
            DIR * from_dir,*to_dir;
            struct dirent *direntp;
            char buf[BUFFERSIZE];
            int in_file,out_file;
            printf("##");//测试一下
           if(ac!=3)
           {
                       perror("NO any file");
                       exit(1);
            }
            printf("$$$$$");//测试,奇怪的地方就发生在这里
            if((from_dir=opendir(av[1]))==NULL)            
            {
                          oops(av[1],av[2]);
             }//打开要复制内容的目录
             printf("$$$") ;
              


             while((direntp=readdir(from_dir))!=NULL)//读出目录内容
             {
                        if((in_file=open(direntp-         >d_name,O_RDONLY))!=-1)//打开目录内一个文件进行读写操作
               {
                            if((to_dir=opendir(av[2]))=NULL)
                            {
                                          out_file=creat(direntp->d_name,0777);//创建文件以便写入内容
                             }
                while(read(in_file,buf,BUFFERSIZE))//把文件的内容放在缓冲区里
                 {
                                 write(out_file,buf,BUFFERSIZE);//从缓冲区里读出文件内容并写入新文件
                  }//
}
}
return 0;
}


void oops(char *s1,char *s2)
{
               fprintf(stderr,"Error :%s",s1);
               perror(s2);
               exit(1);
}//出错处理

#gcc cp3.c -o cp3(成功,没有错误,没有警告)
#./cp3 file1
可以正常执行,输出为NO any file,

问题一:为什么会把前面的printf("##")放在后面了呢,我的输出为
NO any file ###(###怎么会在后面输出)

问题二:程序无法正常运行.目录file1,file2,
#./cp3 file1 file2
(这里就是空白 了,没有什么显示,可以输入字符,要按ctrl+D才会结束)

为什么,连第一个printf语句都没有执行.我头都大了,怎么连第一个printf语句也没执行.
程序哪里出错了呢.

不好意思啊,这帖子肯定长了点.不过程序很简单.大家看一下,谢谢.
 楼主| 发表于 2009-7-21 22:36:26 | 显示全部楼层
我是昨天才开始学的linux编程.不大会写.大家见谅.因为连第一个printf语句都没有执行,我自己就完全头大了,不知道怎么办.
回复 支持 反对

使用道具 举报

发表于 2009-7-22 01:17:17 | 显示全部楼层
感觉错误好多。
文件操作那一部分的错误:文件操作结束后没有关闭文件;新建的文件在原路径下;判断用==,不是=
至于输出顺序的问题,虽然默认输出都是终端,但是标准输出与标准错误输出是不一样的。由于你没加换行,所以##与$$$$$其实是一行。遇到##时一行未结束,所以先输出了no any file。换行就可以了。
你可以试下下面的代码
printf("aaaaaa")
perror("test")
printf("bbbbbb")
perror("test")
pinrtf("cccccc")
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-7-22 08:28:18 | 显示全部楼层
因为我是在虚拟机,没安桌面,不能上论坛.只能在那抄过来 的,有些地方抄错了.
回复 支持 反对

使用道具 举报

发表于 2009-7-22 09:56:36 | 显示全部楼层
楼主把每个 printf 后面都加上 \n 就都解决问题了。

printf("##\n");
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-7-22 10:03:40 | 显示全部楼层
平时不注意细节,就吃了亏
回复 支持 反对

使用道具 举报

发表于 2009-7-24 04:31:10 | 显示全部楼层
#include <sys/types.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <pthread.h>
#include <dirent.h>
#include <string.h>

#define BUFFERSIZE 4096
#define MAXNAME 200

char buf[BUFFERSIZE];
char cor_dir[MAXNAME];
char new_fpath[MAXNAME];

void oops(char *s1,char *s2)
{
fprintf(stderr,"Error %s",s1);
perror(s2);
exit(1);
}//出错处理

char *chkdir(char dirname[])
{
if(dirname[0]!='/')
{
getcwd(cor_dir,MAXNAME);
strcat(cor_dir,"/");
if(strcmp(dirname,"./")==0)
dirname=dirname+2;
strcat(cor_dir,dirname);
return (char *)cor_dir;
}
else
return (char *)dirname;
}//更改目录名

char *getfpath(char *filename,char *dirname)
{
int num;
strcpy(new_fpath,dirname);
num=strlen(dirname);
if(*(new_fpath+num-1)!='/')
strcat(new_fpath,"/");
strcat(new_fpath,filename);
if(strlen(new_fpath)!=0)
return (char *)new_fpath;
else
return NULL;
}//创建文件地址


int main(int argc,char *argv[])
{
DIR *from_dir,*to_dir;
struct dirent *direntp;
char *filepath,*sor_dir,*des_dir,*temp;
int in_file,out_file;
int i;

printf("##\n");//测试一下
if(argc!=3)
{
printf("NO any files\n");
exit(1);
}

sor_dir=calloc(MAXNAME,sizeof(char));
des_dir=calloc(MAXNAME,sizeof(char));

temp=chkdir(argv[1]);
for(i=0;*(temp+i)!='\0';i++)
*(sor_dir+i)=*(temp+i);
*(sor_dir+i)='\0';
temp=chkdir(argv[2]);
for(i=0;*(temp+i)!='\0';i++)
*(des_dir+i)=*(temp+i);
*(des_dir+i)='\0';

printf("$$$$$\n");//测试,奇怪的地方就发生在这里

if((from_dir=opendir(sor_dir))==NULL)
oops(argv[1],argv[2]);

if((to_dir=opendir(des_dir))==NULL)
oops(argv[1],argv[2]);

printf("$$$\n") ;

while((direntp=readdir(from_dir))!=NULL)
{
memset(buf,0x0,BUFFERSIZE);

if((strcmp(direntp->d_name,"..")==0)||(strcmp(direntp->d_name,".")==0))
continue;
filepath=getfpath(direntp->d_name,sor_dir);
printf("Copy file:%s\n",filepath);

if((in_file=open(filepath,O_RDONLY))==-1)
{
perror("\nOpean File Error:");
continue;
}
if((filepath=getfpath(direntp->d_name,des_dir))==NULL)
{
perror("\nChange file path error");
exit(1);
}
else if((out_file=creat(filepath,0666))<0)
{
perror("\nCreat file error:");
exit(1);
}
else if(read(in_file,buf,BUFFERSIZE)==-1)
{
perror("\nRead file error:");
exit(1);
}
else if(write(out_file,buf,sizeof(buf))==-1)
{
printf("%d/n",out_file);
perror("Write file error");
exit(1);
}
}

free(sor_dir);
free(des_dir);

return 0;
}
--------------------------------------------------------
我将部分代码改过了,结果OK!
回复 支持 反对

使用道具 举报

发表于 2009-8-9 19:41:03 | 显示全部楼层
收藏了  ^_^  经典  实在太有才了                        
   
     
      
   
   
  
     
      
------------------------------------------------------------
李丽珍歌秀一吸白,大略驾群魔力挺
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表