-1

我想读取命令行参数中给出的文件并在读取后将其删除。这就是我正在做的事情。

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”不变。为什么会这样?如何删除命令行参数中给出的文件。

4

2 回答 2

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]);
于 2013-02-28T21:52:59.510 回答
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);
于 2013-02-28T21:58:19.837 回答