Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用取消链接删除文件_C_Linux_Binaryfiles_Unlink - Fatal编程技术网

C 使用取消链接删除文件

C 使用取消链接删除文件,c,linux,binaryfiles,unlink,C,Linux,Binaryfiles,Unlink,我想读取命令行参数中给出的文件,并在读取后将其删除。这就是我正在做的 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(f

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

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

char *outputfile = strcat(argv[1], ".cmp");
您正在修改argv[1],文件名指向它。您可以尝试使用malloc创建一个新字符串,并将所需的值写入其中

char *newstr = malloc(strlen(argv[1]) + strlen(".cmp") + 1);
sprintf(newstr, "%s.cmp", argv[1]);

这是不好的,也是您的问题的原因:

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);

不仅是修改,而且还写过它的结尾->UB!。嗯,在字符串结束后写入并不一定会导致问题。例如,argv[1]的大小可能比它包含的字符串长。也就是说,这可能不是一个明智的举动,因为你真的没有办法知道它是否安全。我想知道阅读strcat的文档会有多大的伤害。公平地说,没有人阅读文档中他们认为自己理解的东西,但事实上你错了。@wilsonmichaelpatch:我想说,在很多情况下,比这更糟糕的是:人们不阅读文档,不管他们认为自己是否理解它,只是在这里问…@wilsonmichaelpatch也许你会这样做,但不要指责别人这样做。当我准备使用一个新的函数/类/API时,我倾向于阅读文档,即使我以前见过使用它的代码,而且我认为我理解它。