FILE *fp;
.
.
.
while (!feof(fp)) {
ch = fgetc(fp);
if (ferror(fp)) {
printf("File error!\n");
break;
}
}
上のコードでは、feof(fp) が偽のあいだ while でループし、ストリームからデータを読み込むたびに ferror(fp) でエラーチェックをしている。
次のプログラムはファイルのコピーを行う。その際、完全なエラー検査を行う。
#include
#include
int main(int argc, char *argv[])
{
FILE *from, *to;
char ch;
if (argc != 3) {
printf("Usage: %s \n", argv[0]);
exit(1);
}
/* open src file */
if ((from = fopen(argv[1], "rb")) == NULL) {
printf("Cannot open src file.\n");
exit(1);
}
/* open dest file */
if ((to = fopen(argv[2], "wb")) == NULL) {
printf("Cannot open dest file.\n");
exit(1);
}
/* copy file */
while (!feof(from)) {
ch = fgetc(from);
if (ferror(from)) {
printf("Error: at reading file.\n");
exit(1);
}
if (!feof(from)) {
fputc(ch, to);
}
if (ferror(to)) {
printf("Error: at writing to file.\n");
exit(1);
}
}
if (fclose(from) == EOF) {
printf("Error: at closing src file.\n");
exit(1);
}
if (fclose(to) == EOF) {
printf("Error: at closing dest file.\n");
exit(1);
}
return 0;
}
実行例:
takatoh@nightschool $ ./sample_9_3
Usage: ./sample_9_3
takatoh@nightschool $ ./sample_9_3 myfile myfile2
takatoh@nightschool $ cat myfile2
This is a test for file system.
#include
#include
int main(void)
{
char str[80] = "This is a test for file system.\n";
FILE *fp;
char ch, *p;
/* open myfile to write */
if ((fp = fopen("myfile", "w")) == NULL) {
printf("Channot open the file.\n");
exit(1);
}
/* write str. */
p = str;
while (*p) {
if (fputc(*p, fp) == EOF) {
printf("Error.\n");
exit(1);
}
p++;
}
fclose(fp);
/* open myfile to read */
if ((fp = fopen("myfile", "r")) == NULL) {
printf("Channot open the file.\n");
exit(1);
}
/* read the file */
for ( ; ; ) {
ch = fgetc(fp);
if (ch == EOF) {
break;
}
putchar(ch);
}
fclose(fp);
return 0;
}
実行結果:
takatoh@nightschool $ ./sample_9_2
This is a test for file system.
takatoh@nightschool $ ./practice_9_2_1
Usage: ./practice_9_2_1 <textfile>
takatoh@nightschool $ ./practice_9_2_1 myfile
This is a test for file system.
C の入出力システムでは、プログラムと実際のデバイスとのあいだに抽象的なレベルを設けている。これをストリームという。ストリームのおかげで、プログラムからは実際のデバイスにかかわらずほとんど同じように扱える。
これに対して、実際のデバイスをファイルと呼ぶ。この文脈ではいわゆる普通のファイルだけでなく、画面、キーボード、ポートなどを含んでいる。