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