「C言語の基礎 - ファイル」の版間の差分

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動
(ページの作成:「 <br><br> __FORCETOC__ カテゴリ:C」)
 
編集の要約なし
1行目: 1行目:
==  ファイルを移動する ==
C言語で、ファイルを移動するには、stdio.hのrename関数を使用する。<br>
<br>
rename関数は、oldが指すファイルをnewが指す文字列を名前とするファイルとして識別できるようにする関数である。<br>
oldとnewがそれぞれ異なるディレクトリのファイル名を指している場合には、ファイルの移動が行われる。<br>
<br>
rename関数は、ファイル名の変更が成功した場合は0、ファイル名の変更に失敗した場合は0以外の値を返す。<br>
rename関数を呼び出す前に既にファイル名がnewであるファイルが存在している場合、rename関数の動作は処理系定義となるので注意する。<br>
<source lang="c">
#include <stdio.h>
int rename (const char *old, const char *new);
</source>
<br>
以下の例では、rename関数を使用してファイルを移動している。<br>
<source lang="c">
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    char old[] = "./01/sample.txt";
    char new[] = "./02/sample.txt";
    if ( rename(old, new) == 0 )
    {
      printf("%sを%sに移動しました.\n", old, new);
    }
    else
    {
      fprintf(stderr, "%sの移動に失敗しました.\n", old);
    }
    return EXIT_SUCCESS;
}
</source>
<br><br>


== ファイル名を変更する ==
C言語で、ファイルの名前を変更するには、stdio.hのrename関数を使用する。<br>
<br>
rename関数は、oldが指すファイルをnewが指す文字列を名前とするファイルとして識別できるようにする関数である。<br>
oldとnewが同じディレクトリのファイル名を指している場合は、ファイル名の変更が行われる。<br>
<br>
rename関数は、ファイル名の変更が成功した場合は0、ファイル名の変更に失敗した場合は0以外の値を返す。<br>
rename関数を呼び出す前に既にファイル名がnewであるファイルが存在している場合、rename関数の動作は処理系定義となるので注意する。<br>
<source lang="c">
#include <stdio.h>
int rename (const char *old, const char *new);
</source>
<br>
以下の例では、rename関数を使用してファイル名を変更している。<br>
<source lang="c">
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    char old[] = "sample01.txt";
    char new[] = "sample02.txt";
    if ( rename(old, new) == 0 )
    {
      printf("%sの名前を%sに変更しました.\n", old, new);
    }
    else
    {
      fprintf(stderr, "%sのリネームに失敗しました.\n", old);
    }
    return EXIT_SUCCESS;
}
</source>
<br><br>


== ファイルを削除する ==
C言語で、ファイルを削除するには、stdio.hのremove関数を使用する。<br>
<br>
remove関数は、filenameが指すファイルを削除する関数である。<br>
remove関数は、ファイルの削除が成功した場合は0、ファイルの削除に失敗した場合は0以外の値を返す。<br>
既にファイルがオープンされている場合のremove関数の動作は、処理系定義になるので注意する。<br>
<source lang="c">
#include <stdio.h>
int remove (const char *filename);
</source>
<br>
以下の例では、remove関数を使用してファイルを削除している。<br>
<source lang="c">
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    char filename[] = "sample.txt";
    if ( remove(filename) == 0 )
    {
      printf("%sの削除が完了しました.\n", filename);
    }
    else
    {
      fprintf("stderr, %sの削除に失敗しました.\n", filename);
    }
    return EXIT_SUCCESS;
}
</source>
<br><br>


== ファイルを開く ==
ファイルに対して読み書きを行うためには、まず、ファイルを開く必要がある。<br>
C言語で、ファイルを開くには、stdio.hのfopen関数を使用する。<br>
<br>
fopen関数は、filenameで指定されたファイルを開いて、そのファイルにストリームを結び付ける関数である。<br>
modeにはモード(開くファイルの種類やデータの読み書きの方法)を指定する。<br>
fopen関数は、ファイルのオープンに成功した場合は、オープンしたストリームを制御するオブジェクトへのポインタを返し、失敗した場合は、NULLを返す。<br>
<source lang="c">
#include <stdio.h>
FILE * fopen(const char * restrict filename, const char * restrict mode);
</source>
<br>
第2引数のmodeに指定できるモードは以下の通りである。<br>
<center>
{| class="wikitable"
|-
! モード !! ファイル !! 機能 !! ファイルが存在しない場合の動作
|-
| r || テキスト || 読み込み || エラー
|-
| w || テキスト || 書き込み || 新規作成
|-
| a || テキスト || 追加書き込み || 新規作成
|-
| rb || バイナリ || 読み込み || エラー
|-
| wb || バイナリ || 書き込み || 新規作成
|-
| ab || バイナリ || 追加書き込み || 新規作成
|-
| r+ || テキスト || 更新(読み込みおよび書き込み) || エラー
|-
| w+ || テキスト || 更新(読み込みおよび書き込み) || 新規作成
|-
| a+ || テキスト || 更新(追加書き込み) || 新規作成
|-
| rb+ または r+b || バイナリ || 更新(読み込みおよび書き込み) || エラー
|-
| wb+ または w+b || バイナリ || 更新(読み込みおよび書き込み) || 新規作成
|-
| ab+ または a+b || バイナリ || 更新(追加書き込み) || 新規作成
|}
</center>
<br>
fopen関数を使用したファイルのオープンは、多くの場合、以下のような記述で実装される。<br>
以下の例では、sample.txtファイルを書き込みモードでオープンしている。<br>
<source lang="c">
char *filename = "sample.txt";
FILE *fp;
/* ファイルのオープン */
if ((fp = fopen(filename, "w")) == NULL)
{
    /* エラー処理 */
}
/* 何らかの処理 */
/* ファイルのクローズ */
fclose(fp);
</source>
<br>
以下の例では、fopen関数を使用して、ファイルを書き込みモードでオープンしている。<br>
<source lang="c">
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    FILE *fp;
    char *filename = "sample.txt";
    /* ファイルのオープン */
    if ((fp = fopen(filename, "w")) == NULL)
    {
      fprintf(stderr, "%sのオープンに失敗しました.\n", filename);
      exit(EXIT_FAILURE);
    }
    printf("ファイルのオープンに成功しました.\n");
    printf("/*\n");
    printf(" 普通はファイルに対して書き込みを行うコードを\n");
    printf(" ここに書きます.\n");
    printf("*/\n");
    /* ファイルのクローズ */
    fclose(fp);
    return EXIT_SUCCESS;
}
</source>
<br><br>
== ファイルを閉じる ==
読み書き等の処理が終わったファイルはクローズする。<br>
C言語で、ファイルをクローズするには、stdio.hのfclose関数を使用する。<br>
<br>
fclose関数は、streamが指すストリームに結び付けられたファイルをクローズする関数である。<br>
fclose関数は、操作が成功した場合は0、失敗した場合はEOFを返す。<br>
<source lang="c">
#include <stdio.h>
int fclose(FILE *stream);
</source>
<br>
以下の例では、fclose関数を使用してファイルをクローズしている。<br>
<source lang="c">
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    FILE *fp;
    char *filename = "sample.txt";
    /* ファイルのオープン */
    if ((fp = fclose(filename, "w")) == NULL)
    {
      fprintf(stderr, "%sのオープンに失敗しました.\n", filename);
      exit(EXIT_FAILURE);
    }
    /* ファイルのクローズ */
    fclose(fp);
    printf("ファイルをクローズしました.\n");
    return EXIT_SUCCESS;
}
</source>
<br><br>
== ファイルをクローズしてから新しいファイルをオープンする ==
C言語で、ファイルをクローズしてから新しいファイルをオープンするには、freopen関数を使用する。<br>
fopen関数とfclose関数を組み合わせて使用してもよいが、freopen関数は、1度の呼び出しでこれらの処理を行うため、短く記述できる。<br>
<br>
freopen関数は、streamが指す既存のストリームをクローズしてから、filenameが指すファイルをmodeが指すモードでオープンして、<br>
そのファイルにストリームを結び付ける関数である。<br>
(指定可能なモードについては、fopen関数と同様である。詳しくは、上記のfopen関数のモードを参照すること)<br>
<br>
freopen関数は、操作が成功した場合は、オープンしたストリームを制御するオブジェクトへのポインタを返し、失敗した場合はNULLを返す。<br>
<source lang="c">
#include <stdio.h>
FILE * freopen(const char * restrict filename, const char * restrict mode, FILE * restrict  stream);
</source>
<br>
以下の例では、freopen関数を使用して、ファイルをクローズしてから新しいファイルをオープンしている。<br>
<source lang="c">
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 256
int main(void)
{
    FILE *fp;
    char *filename = "sample.txt";
    char *writeline = "I don't want to march as much as possible.";
    char readline[N] = {'\0'};
    /* ファイルを書き込みモードでオープン */
    if ((fp = fopen(filename, "w")) == NULL)
    {
      fprintf(stderr, "%sのオープンに失敗しました.\n", filename);
      exit(EXIT_FAILURE);
    }
    /* 文字列をsample.txtに書き込む */
    fputs(writeline, fp);
    /* ファイルをクローズし, 読み込みモードで再オープン */
    if ((fp = freopen(filename, "r", fp)) == NULL)
    {
      fprintf(stderr, "%sの再オープンに失敗しました.\n 詳細:%s", filename, strerror(errno));
      exit(EXIT_FAILURE);
    }
    /* ファイルの終端まで文字を読み取り表示する */
    fgets(readline, N, fp);
    puts(readline);
    /* ファイルのクローズ */
    fclose(fp);
    return EXIT_SUCCESS;
}
</source>
<br><br>
== ファイルから1文字ずつ文字を読み込む ==
C言語で、ファイルから1文字ずつ文字を読み込むには、stdio.hのfgetc関数またはgetc関数(マクロ)を使用する。<br>
<br>
fgetc関数は、streamが指すストリームから1文字分文字を読み取る関数である。<br>
getc関数は、基本的にはfgetc関数と同様だが、処理系によっては関数ではなくマクロとして実装されている場合がある。<br>
<br>
fgetc関数とgetc関数は、ストリームから正常に文字を読み取った場合は、読み取った文字を返す。<br>
読み取りに失敗した場合やファイルの終端を読み取った場合は、EOFを返す。<br>
<source lang="c">
#include <stdio.h>
int fgetc(FILE *stream);
int getc(FILE *stream);
</source>
<br>
以下の例では、fgetc関数を使用して、ファイルの終端まで文字を読み取っている。<br>
<source lang="c">
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    FILE *fp;
    char *filename = "sample.txt";
    int ch;
    /* ファイルのオープン */
    if ((fp = fopen(filename, "r")) == NULL)
    {
      fprintf(stderr, "%sのオープンに失敗しました.\n", filename);
      exit(EXIT_FAILURE);
    }
    /* ファイルの終端まで文字を読み取り表示する */
    while (( ch = fgetc(fp)) != EOF )
    {
      putchar(ch);
    }
    /* ファイルのクローズ */
    fclose(fp);
    return EXIT_SUCCESS;
}
</source>
<br><br>
== ファイルから1行ずつ文字列を読み込む ==
C言語で、ファイルから1行ずつ文字列を読み込むには、stdio.hのfgets関数を使用する。<br>
<br>
fgets関数は、streamが指すストリームから改行文字またはファイルの終わりまで文字列を読み取り、sが指す配列に格納する関数である。<br>
なお、n - 1が1行の最大文字数となる。<br>
fgets関数は、ストリームから正常に文字列を読み取った場合は、読み取った文字列を返す。<br>
読み取りに失敗した場合やファイルの終端を読み取った場合は、NULLを返す。<br>
<source lang="c">
#include <stdio.h>
char *fgets (char * restrict s, int n, FILE * restrict stream);
</source>
<br>
以下の例では、fgets関数を使用して、ファイルの終端まで文字列を読み取っている。<br>
<source lang="c">
#include <stdio.h>
#include <stdlib.h>
#define N 256
int main(void)
{
    FILE *fp;
    char *filename = "sample.txt";
    char readline[N] = {'\0'};
    /* ファイルのオープン */
    if ((fp = fopen(filename, "r")) == NULL)
    {
      fprintf(stderr, "%sのオープンに失敗しました.\n", filename);
      exit(EXIT_FAILURE);
    }
    /* ファイルの終端まで文字を読み取り表示する */
    while ( fgets(readline, N, fp) != NULL )
    {
      printf("%s", readline);
    }
    /* ファイルのクローズ */
    fclose(fp);
    return EXIT_SUCCESS;
}
</source>
<br><br>
<br><br>


__FORCETOC__
__FORCETOC__
[[カテゴリ:C]]
[[カテゴリ:C]]

2020年4月30日 (木) 17:10時点における版

ファイルを移動する

C言語で、ファイルを移動するには、stdio.hのrename関数を使用する。

rename関数は、oldが指すファイルをnewが指す文字列を名前とするファイルとして識別できるようにする関数である。
oldとnewがそれぞれ異なるディレクトリのファイル名を指している場合には、ファイルの移動が行われる。

rename関数は、ファイル名の変更が成功した場合は0、ファイル名の変更に失敗した場合は0以外の値を返す。
rename関数を呼び出す前に既にファイル名がnewであるファイルが存在している場合、rename関数の動作は処理系定義となるので注意する。

 #include <stdio.h>
 
 int rename (const char *old, const char *new);


以下の例では、rename関数を使用してファイルを移動している。

 #include <stdio.h>
 #include <stdlib.h>
 
 int main(void)
 {
    char old[] = "./01/sample.txt";
    char new[] = "./02/sample.txt";
 
    if ( rename(old, new) == 0 )
    {
       printf("%sを%sに移動しました.\n", old, new);
    }
    else
    {
       fprintf(stderr, "%sの移動に失敗しました.\n", old);
    }
 
    return EXIT_SUCCESS;
 }



ファイル名を変更する

C言語で、ファイルの名前を変更するには、stdio.hのrename関数を使用する。

rename関数は、oldが指すファイルをnewが指す文字列を名前とするファイルとして識別できるようにする関数である。
oldとnewが同じディレクトリのファイル名を指している場合は、ファイル名の変更が行われる。

rename関数は、ファイル名の変更が成功した場合は0、ファイル名の変更に失敗した場合は0以外の値を返す。
rename関数を呼び出す前に既にファイル名がnewであるファイルが存在している場合、rename関数の動作は処理系定義となるので注意する。

 #include <stdio.h>
 
 int rename (const char *old, const char *new);


以下の例では、rename関数を使用してファイル名を変更している。

 #include <stdio.h>
 #include <stdlib.h>
 
 int main(void)
 {
    char old[] = "sample01.txt";
    char new[] = "sample02.txt";
 
    if ( rename(old, new) == 0 )
    {
       printf("%sの名前を%sに変更しました.\n", old, new);
    }
    else
    {
       fprintf(stderr, "%sのリネームに失敗しました.\n", old);
    }
 
    return EXIT_SUCCESS;
 }



ファイルを削除する

C言語で、ファイルを削除するには、stdio.hのremove関数を使用する。

remove関数は、filenameが指すファイルを削除する関数である。
remove関数は、ファイルの削除が成功した場合は0、ファイルの削除に失敗した場合は0以外の値を返す。
既にファイルがオープンされている場合のremove関数の動作は、処理系定義になるので注意する。

 #include <stdio.h>
 
 int remove (const char *filename);


以下の例では、remove関数を使用してファイルを削除している。

 #include <stdio.h>
 #include <stdlib.h>
 
 int main(void)
 {
    char filename[] = "sample.txt";
 
    if ( remove(filename) == 0 )
    {
       printf("%sの削除が完了しました.\n", filename);
    }
    else
    {
       fprintf("stderr, %sの削除に失敗しました.\n", filename);
    }
 
    return EXIT_SUCCESS;
 }



ファイルを開く

ファイルに対して読み書きを行うためには、まず、ファイルを開く必要がある。
C言語で、ファイルを開くには、stdio.hのfopen関数を使用する。

fopen関数は、filenameで指定されたファイルを開いて、そのファイルにストリームを結び付ける関数である。
modeにはモード(開くファイルの種類やデータの読み書きの方法)を指定する。
fopen関数は、ファイルのオープンに成功した場合は、オープンしたストリームを制御するオブジェクトへのポインタを返し、失敗した場合は、NULLを返す。

 #include <stdio.h>
 
 FILE * fopen(const char * restrict filename, const char * restrict mode);


第2引数のmodeに指定できるモードは以下の通りである。

モード ファイル 機能 ファイルが存在しない場合の動作
r テキスト 読み込み エラー
w テキスト 書き込み 新規作成
a テキスト 追加書き込み 新規作成
rb バイナリ 読み込み エラー
wb バイナリ 書き込み 新規作成
ab バイナリ 追加書き込み 新規作成
r+ テキスト 更新(読み込みおよび書き込み) エラー
w+ テキスト 更新(読み込みおよび書き込み) 新規作成
a+ テキスト 更新(追加書き込み) 新規作成
rb+ または r+b バイナリ 更新(読み込みおよび書き込み) エラー
wb+ または w+b バイナリ 更新(読み込みおよび書き込み) 新規作成
ab+ または a+b バイナリ 更新(追加書き込み) 新規作成


fopen関数を使用したファイルのオープンは、多くの場合、以下のような記述で実装される。
以下の例では、sample.txtファイルを書き込みモードでオープンしている。

 char *filename = "sample.txt";
 FILE *fp;
 
 /* ファイルのオープン */
 if ((fp = fopen(filename, "w")) == NULL)
 {
    /* エラー処理 */
 }
 
 /* 何らかの処理 */
 
 /* ファイルのクローズ */
 fclose(fp);


以下の例では、fopen関数を使用して、ファイルを書き込みモードでオープンしている。

 #include <stdio.h>
 #include <stdlib.h>
 
 int main(void)
 {
    FILE *fp;
    char *filename = "sample.txt";
 
    /* ファイルのオープン */
    if ((fp = fopen(filename, "w")) == NULL)
    {
       fprintf(stderr, "%sのオープンに失敗しました.\n", filename);
 
       exit(EXIT_FAILURE);
    }
 
    printf("ファイルのオープンに成功しました.\n");
    printf("/*\n");
    printf(" 普通はファイルに対して書き込みを行うコードを\n");
    printf(" ここに書きます.\n");
    printf("*/\n");
 
    /* ファイルのクローズ */
    fclose(fp);
 
    return EXIT_SUCCESS;
 }



ファイルを閉じる

読み書き等の処理が終わったファイルはクローズする。
C言語で、ファイルをクローズするには、stdio.hのfclose関数を使用する。

fclose関数は、streamが指すストリームに結び付けられたファイルをクローズする関数である。
fclose関数は、操作が成功した場合は0、失敗した場合はEOFを返す。

 #include <stdio.h>
 
 int fclose(FILE *stream);


以下の例では、fclose関数を使用してファイルをクローズしている。

 #include <stdio.h>
 #include <stdlib.h>
 
 int main(void)
 {
    FILE *fp;
    char *filename = "sample.txt";
 
    /* ファイルのオープン */
    if ((fp = fclose(filename, "w")) == NULL)
    {
       fprintf(stderr, "%sのオープンに失敗しました.\n", filename);
 
       exit(EXIT_FAILURE);
    }
 
    /* ファイルのクローズ */
    fclose(fp);
 
    printf("ファイルをクローズしました.\n");
 
    return EXIT_SUCCESS;
 }



ファイルをクローズしてから新しいファイルをオープンする

C言語で、ファイルをクローズしてから新しいファイルをオープンするには、freopen関数を使用する。
fopen関数とfclose関数を組み合わせて使用してもよいが、freopen関数は、1度の呼び出しでこれらの処理を行うため、短く記述できる。

freopen関数は、streamが指す既存のストリームをクローズしてから、filenameが指すファイルをmodeが指すモードでオープンして、
そのファイルにストリームを結び付ける関数である。
(指定可能なモードについては、fopen関数と同様である。詳しくは、上記のfopen関数のモードを参照すること)

freopen関数は、操作が成功した場合は、オープンしたストリームを制御するオブジェクトへのポインタを返し、失敗した場合はNULLを返す。

 #include <stdio.h>
 
 FILE * freopen(const char * restrict filename, const char * restrict mode, FILE * restrict  stream);


以下の例では、freopen関数を使用して、ファイルをクローズしてから新しいファイルをオープンしている。

 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 
 #define N 256
 
 int main(void)
 {
    FILE *fp;
    char *filename = "sample.txt";
    char *writeline = "I don't want to march as much as possible.";
    char readline[N] = {'\0'};
 
    /* ファイルを書き込みモードでオープン */
    if ((fp = fopen(filename, "w")) == NULL)
    {
       fprintf(stderr, "%sのオープンに失敗しました.\n", filename);
 
       exit(EXIT_FAILURE);
    }
 
    /* 文字列をsample.txtに書き込む */
    fputs(writeline, fp);
 
    /* ファイルをクローズし, 読み込みモードで再オープン */
    if ((fp = freopen(filename, "r", fp)) == NULL)
    {
       fprintf(stderr, "%sの再オープンに失敗しました.\n 詳細:%s", filename, strerror(errno));
 
       exit(EXIT_FAILURE);
    }
 
    /* ファイルの終端まで文字を読み取り表示する */
    fgets(readline, N, fp);
    puts(readline);
 
    /* ファイルのクローズ */
    fclose(fp);
 
    return EXIT_SUCCESS;
 }



ファイルから1文字ずつ文字を読み込む

C言語で、ファイルから1文字ずつ文字を読み込むには、stdio.hのfgetc関数またはgetc関数(マクロ)を使用する。

fgetc関数は、streamが指すストリームから1文字分文字を読み取る関数である。
getc関数は、基本的にはfgetc関数と同様だが、処理系によっては関数ではなくマクロとして実装されている場合がある。

fgetc関数とgetc関数は、ストリームから正常に文字を読み取った場合は、読み取った文字を返す。
読み取りに失敗した場合やファイルの終端を読み取った場合は、EOFを返す。

 #include <stdio.h>
 
 int fgetc(FILE *stream);
 
 int getc(FILE *stream);


以下の例では、fgetc関数を使用して、ファイルの終端まで文字を読み取っている。

 #include <stdio.h>
 #include <stdlib.h>
 
 int main(void)
 {
    FILE *fp;
    char *filename = "sample.txt";
    int ch;
 
    /* ファイルのオープン */
    if ((fp = fopen(filename, "r")) == NULL)
    {
       fprintf(stderr, "%sのオープンに失敗しました.\n", filename);
 
       exit(EXIT_FAILURE);
    }
 
    /* ファイルの終端まで文字を読み取り表示する */
    while (( ch = fgetc(fp)) != EOF )
    {
       putchar(ch);
    }
 
    /* ファイルのクローズ */
    fclose(fp);
 
    return EXIT_SUCCESS;
 }



ファイルから1行ずつ文字列を読み込む

C言語で、ファイルから1行ずつ文字列を読み込むには、stdio.hのfgets関数を使用する。

fgets関数は、streamが指すストリームから改行文字またはファイルの終わりまで文字列を読み取り、sが指す配列に格納する関数である。
なお、n - 1が1行の最大文字数となる。
fgets関数は、ストリームから正常に文字列を読み取った場合は、読み取った文字列を返す。
読み取りに失敗した場合やファイルの終端を読み取った場合は、NULLを返す。

 #include <stdio.h>
 
 char *fgets (char * restrict s, int n, FILE * restrict stream);


以下の例では、fgets関数を使用して、ファイルの終端まで文字列を読み取っている。

 #include <stdio.h>
 #include <stdlib.h>
 
 #define N 256
 
 int main(void)
 {
    FILE *fp;
    char *filename = "sample.txt";
    char readline[N] = {'\0'};
 
    /* ファイルのオープン */
    if ((fp = fopen(filename, "r")) == NULL)
    {
       fprintf(stderr, "%sのオープンに失敗しました.\n", filename);
 
       exit(EXIT_FAILURE);
    }
 
    /* ファイルの終端まで文字を読み取り表示する */
    while ( fgets(readline, N, fp) != NULL )
    {
       printf("%s", readline);
    }
 
    /* ファイルのクローズ */
    fclose(fp);
 
    return EXIT_SUCCESS;
 }