rename()、remove()、rewind()

rename()

rename() はファイル名を変更する。

int rename(char *旧ファイル名, char *新ファイル名);

成功すると 0 を返し、エラーが発生すると 0 以外の値を返す。

#include
#include

int main(int argc, char *argv[])
{
    if (rename(argv[1], argv[2])) {
        printf("Error.\n");
        exit(1);
    } else {
        printf("Renamed successfully.\n");
    }

    return 0;
}
takatoh@nightschool $ ls *.txt
myfile.txt
takatoh@nightschool $ ./sample_9_7a myfile.txt yourfile.txt
Renamed successfully.
takatoh@nightschool $ ls *.txt
yourfile.txt

remove()

remove() はファイルを削除する。

int remove(char *ファイル名);

成功すると 0 を返し、エラーが発生すると 0 以外の値を返す。

#include
#include

int main(int argc, char *argv[])
{
    if (rename(argv[1], argv[2])) {
        printf("Error.\n");
        exit(1);
    } else {
        printf("Renamed successfully.\n");
    }

    return 0;
}
takatoh@nightschool $ ls *.txt
yourfile.txt
takatoh@nightschool $ ./sample_9_7b yourfile.txt
Remove successfully.
takatoh@nightschool $ ls *.txt
ls: *.txt にアクセスできません: そのようなファイルやディレクトリはありません

rewind()

rewind() はストリームの現在位置を先頭に巻き戻す。

void rewind(FILE *ストリーム);

rewind() に戻り値はない。開くことが出来たファイルはすべて巻き戻すこともできるから。
次のプログラムは、ファイルの内容を表示したあと、先頭まで巻き戻してもう一度表示する。

#include
#include

int main(int argc, char *argv[])
{
    FILE *fp;

    if (argc != 2) {
        printf("Filename not given.\n");
        exit(1);
    }

    if ((fp = fopen(argv[1], "r")) == NULL) {
        printf("Cannot open file: %s\n", argv[1]);
        exit(1);
    }

    /* display file contents */
    while (!feof(fp)) {
        putchar(getc(fp));
    }

    /* rewind */
    rewind(fp);

    /* display once more */
    while (!feof(fp)) {
        putchar(getc(fp));
    }

    fclose(fp);

    return 0;
}
takatoh@nightschool $ ./sample_9_7c myfile
Hello
I'm takatoh
How are you?
�Hello
I'm takatoh
How are you?
�takatoh@nightschool $

なんかファイルの最後に変な文字が出力されてるな。何だろ?

[追記]

上の「変な文字」にいついてコメントで教えてもらった。詳しくはコメントを見て欲しいけど、要するに getc() が返した EOF を出力している、てことみたいだ。
次のように getc() の戻り値をチェックするように変更したらでなくなった。

#include
#include

int main(int argc, char *argv[])
{
    FILE *fp;
    char ch;

    if (argc != 2) {
        printf("Filename not given.\n");
        exit(1);
    }

    if ((fp = fopen(argv[1], "r")) == NULL) {
        printf("Cannot open file: %s\n", argv[1]);
        exit(1);
    }

    /* display file contents */
    while (!feof(fp)) {
        ch = getc(fp);
        if (ch == EOF) {
            break;
        }
        putchar(ch);
    }

    /* rewind */
    rewind(fp);

    /* display once more */
    while (!feof(fp)) {
        ch = getc(fp);
        if (ch == EOF) {
            break;
        }
        putchar(ch);
    }

    fclose(fp);

    return 0;
}
takatoh@nightschool $ ./sample_9_7d myfile
Hello
I'm takatoh
How are you?
Hello
I'm takatoh
How are you?

「rename()、remove()、rewind()」への1件のフィードバック

  1. ファイルの最後の文字を読み込んだ時点ではまだ「ファイルの終端に逹っした」ということになっていません。 ファイルの最後の文字を越えて読込もうとした段階でフラグが ON になり feof が真を返すようになります。 つまり、この事例では EOF (-1) を putchar してしまい、一文字分だけ余計な出力になってしまうのです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください