2013-02-28 165 views
-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」爲它是。爲什麼這樣?如何刪除命令行參數中給出的文件。

+2

我想知道讀了'strcat()'的文檔會受到多大的傷害。 – 2013-02-28 21:55:13

+2

公平地說,沒有人閱讀他們認爲他們理解的事情的文檔,但實際上是錯誤的。 – wilsonmichaelpatrick 2013-02-28 21:59:43

+1

@wilsonmichaelpatrick:我會說太多的情況比這更糟糕:人們不會閱讀文檔,不管他們是否認爲他們理解它,只是在這裏問...... – NotMe 2013-03-01 03:06:16

回答

5
char *outputfile = strcat(argv[1], ".cmp"); 

要修改argv[1],並filename指向它。您可以嘗試使用mallocsprintf創建一個新字符串 - 將所需的值寫入它。

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

不僅修改,而且寫作過去了 - > ** UB!**。 – 2013-02-28 21:53:28

+0

那麼,寫過一個字符串的末尾並不一定會導致問題。例如,'argv [1]'的大小可能比它包含的字符串更長。也就是說,這可能不是一個明智之舉,因爲你真的沒有辦法確定它是否安全。 – 2013-02-28 21:54:03

+2

@CarlNorum讓我們不要理由支持「UB工作」...... – 2013-02-28 21:54:39

3

這是不好的,是你的問題的原因:

char *outputfile = strcat(argv[1], ".cmp"); 

這樣做是:

1)追加 「.cmp」 做argv [1]。不要這樣做!您不知道argv [1]指向的緩衝區有多少空間,因此這可能會覆蓋/損壞其他一些數據。 2)strcat返回一個指向串聯字符串的指針,它只是在末尾危險地添加了「.cmp」的argv [1]。 strcat不爲分配新字符串的空間。 3)所以你真的做了什麼附加「.cmp」原來的,所以argv[1]outputfile指向相同的字符串,並可能損壞了一些內存。

你應該做的是一個字符串分配空間:

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

,然後在年底回饋內存。

free(outputfile); 
相關問題