-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」をそのままにして「mytxt.cmp」を削除しています。なぜそうなのですか?コマンドライン引数で指定されたファイルを削除するにはどうすればよいですか?

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)argv[1]に「.cmp」を追加します。これをしないでください!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 に答える