我想读取命令行参数中给出的文件,并在读取后将其删除。这就是我正在做的事情。
char *filename = argv[1];
char *outputfile = strcat(argv[1], ".cmp");
fd = open(argv[1], O_RDONLY);
chars = read(fd, buf, BUFFERSIZE);
fd1 = creat(outputfile, 0644);
write(fd1, buf, BUFFERSIZE);
close(fd1);
close(fd);
unlink(argv[1]);
如果我在命令行中输入“mytxt”,代码应该创建“mytxt.cmp”文件并删除“mytxt”,而不是删除“mytxt.cmp”,保持“mytxt”不变。为什么会这样?如何删除命令行参数中给出的文件。
答案 0 :(得分:5)
char *outputfile = strcat(argv[1], ".cmp");
您正在修改argv[1]
,filename
指向它。您可以尝试使用malloc
和sprintf
创建一个新字符串 - 将所需值添加到其中。
char *newstr = malloc(strlen(argv[1]) + strlen(".cmp") + 1);
sprintf(newstr, "%s.cmp", argv[1]);
答案 1 :(得分:4)
这不好,是导致问题的原因:
char *outputfile = strcat(argv[1], ".cmp");
这是做什么的:
1)将“.cmp”附加到argv [1]。不要这样做!您不知道argv [1]指向的缓冲区中有多少空间,因此可能会覆盖/损坏其他一些数据。
2)strcat返回一个指向连接字符串的指针,该字符串只是argv [1],最后危险地添加了“.cmp”。 strcat
不为新字符串分配空间。
3)所以你真正做的是将“.cmp”附加到原始文件中,因此argv[1]
和outputfile
都指向相同的字符串,并且可能损坏了一些内存。
您应该做的是为字符串分配空间:
char* outputfile = (char*)(malloc(strlen(argv[1]) + strlen(".cmp") + 1));
sprintf(outputfile, "%s.cmp", argv[1]);
然后在最后给回记忆。
free(outputfile);