問題① オープンモードが “w” の場合と、“a” の場合との挙動の違いを確かめてください。
“w” は通常の書き込みモード、“a” は追記モードです。 挙動の違いを確かめるには、何度か実行を繰り返す必要があります。 まずはテストプログラムを用意しましょう。
#include <stdio.h>
#include <stdlib.h>
#define APPEND_MODE // 定義すると "a"。定義しないと "w"
int main(void)
{
#ifdef APPEND_MODE
FILE* fp = fopen( "hello.txt", "a" );
#else
FILE* fp = fopen( "hello.txt", "w" );
#endif
if( fp == NULL ){
( "ファイルオープンに失敗しました。\n", stderr );
fputs( EXIT_FAILURE );
exit}
if( fputs( "Hello, World\n", fp ) == EOF ){
( "ファイルへの書き込みに失敗しました。\n", stderr );
fputs( EXIT_FAILURE );
exit}
if( fclose( fp ) == EOF ){
( "ファイルクローズに失敗しました。\n", stderr );
fputs( EXIT_FAILURE );
exit}
}
“a” を使って、1度実行すると、hello.txt は次のようになります。
実行結果(hello.txt)
Hello, World
続けてもう1度実行すると、次のようになります。
実行結果(hello.txt)
Hello, World
Hello, World
このように、“a” を使うと、以前のファイルの内容を保持したままで新しいデータが書き込まれていきます。 本当は、出力するメッセージも変えて確かめてみるとより良いと思いますので、試してみてください。
一方、“w” を使った場合には、以前のファイルの内容は失われて、新規のデータとして書き込まれます。 そのため、何度実行しても、次の状態にしかなりません。
実行結果(hello.txt)
Hello, World
問題② オープンモードの “a+” を使い、ファイルへの追記を行った後、ファイル全体を標準出力へ出力するプログラムを作成してください。
適当に中身を書き込んである test.txt があるとします。
実行前のファイル(test.txt)
aaa
bbb
ccc
プログラムは次のようになります。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE* fp = fopen( "test.txt", "a+" );
if( fp == NULL ){
( "ファイルオープンに失敗しました。\n", stderr );
fputs( EXIT_FAILURE );
exit}
// ファイルの末尾へ追記
if( fputs( "xyz\n", fp ) == EOF ){
( "ファイルへの書き込みに失敗しました。\n", stderr );
fputs( EXIT_FAILURE );
exit}
// ファイルポジションを先頭に戻す
if( fseek(fp, 0L, SEEK_SET) != 0 ){
( "ファイルポジションの移動に失敗しました。\n", stderr );
fputs( EXIT_FAILURE );
exit}
// ファイル全体を標準出力へ出力する
for( ;; ){
int c = fgetc( fp );
if( c == EOF ){
if( feof( fp ) ){
break;
}
else if( ferror( fp ) ){
( "読み込み中にエラーが発生しました。\n", stderr );
fputs( EXIT_FAILURE );
exit}
else{
// 有効な文字なので、そのまま続行
}
}
( "%c", (char)c );
printf}
( "\n" );
printf
if( fclose( fp ) == EOF ){
( "ファイルクローズに失敗しました。\n", stderr );
fputs( EXIT_FAILURE );
exit}
}
実行後のファイル(test.txt)
aaa
bbb
ccc
xyz
実行結果(標準出力)
aaa
bbb
ccc
xyz
return 0;
を削除(C言語編全体でのコードの統一)≪さらに古い更新履歴を展開する≫
Programming Place Plus のトップページへ