例如,我有一个文件test1.txt,里面有#34;这是一个测试文件"。 我有一个目录/ testDir。如果我将其作为./cp2 test1.txt / testDir运行 该程序将运行但test1.txt将变为空,并且/testDir/test1.text将变为空。任何人都可以识别我的代码中我在哪里覆盖两个文本文件的内容吗?
提前谢谢你。
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h> // for strtol
#include <string.h>
#define COPYMODE 0644
#define BUFFERSIZE 1024
void errExit(char*, char*);
void copyFile(char *src, char* dest) {
int srcFd;
int dstFd;
int charCnt;
char buf[BUFFERSIZE];
/*Check args*/
/*Open the files*/
if( (srcFd=open(src, O_RDONLY)) == -1){
errExit("Cannot open ", src);
}
if( (dstFd=creat(dest, COPYMODE)) ==-1) {
errExit("Cannot create ", dest);
}
/*Copy the data*/
while( (charCnt= read(srcFd, buf, BUFFERSIZE)) > 0 ){
if( write(dstFd,buf,charCnt ) != charCnt ){
errExit("Write error to ", dest);
}
}
if( charCnt==-1 ){
errExit("Read error from ", src);
}
/*Close files*/
if ( close(srcFd) == -1 || close(dstFd) == -1 ){
errExit("Error closing files","");
}
}
main(int argC, char* argV[]) {
char* src = argV[1];
char* dest = argV[2];
if(src[0] != '/' && dest[0] != '/' ) {
copyFile(src, dest);
} else if(src[0] !='/' && dest[0] == '/') { //going to change this to check if its a dir or file.
int i;
for(i=1; i<=strlen(dest); i++) {
dest[(i-1)] = dest[i];
}
strcat(dest, "/");
strcat(dest, src);
copyFile(dest, src);
}
}
答案 0 :(得分:0)
有几个问题:
您对COPYMODE
的定义是错误的,您需要这样:
#define COPYMODE S_IRWXU|S_IWUSR|S_IRGRP|S_IROTH
阅读creat
这可能不是一个好主意:
strcat(dest, "/");
strcat(dest, src);
在这里修改dest
指向的字符串。这没关系,但只有当新字符串不长于dest
指向的字符串时,才会有更多详细信息here。
您需要为您构建的字符串添加另一个缓冲区:
char destfilename[300];
strcpy(destfilename, dest);
strcat(destfilename, "/");
strcat(destfilename, src);
copyFile(destfilename, src);