C言語のファイル入出力

ファイル処理の手順は、ファールオープン->ファイルの読み書き->ファイルクローズとなる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main(void){
 
    FILE *fp;
    int ch;
 
    fp = fopen("myfile1.txt", "r");
    if (fp == NULL) return 1;
 
    ch = fgetc(fp);
    printf("ch=%c\n", ch);
 
    fclose(fp);
 
    return 0;
}

$ touch myfile1.txt
$ sudo vi myfile1.txt
$ ./dev
ch=a

ファイルが正常にオープンされると、ポインタを返す
FILE *fi, *foが良く使われる
入出力データの処理を効率的に行う為、ストリームという概念を使用する(stdin, stdout, stderr)
fp = fopen(“myfile1.txt”, “r”); と記述する

### fopen関数のオープンモード
r: read
w: write
a: apend
rb: binary fileのread
wb: binary fileのwrite
ab: binary fileのappend
※バイナリファイルとは自動変換を行わないこと

### ファイル入出力関数
fputs(), fgetc(), fputs(), fgets(), fprintf(), fscanf()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int main(void){
 
    FILE *fp;
    char ss[256];
 
    if((fp=fopen("myfile1.txt", "r")) == NULL){
        printf("file cannot open.\n");
        return 1;
    }
 
    while (fgets(ss, 256, fp) != NULL){
        printf("%s", ss);
    }
 
    fclose(fp);
 
    return 0;
}

### ファイル出力

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int main(void){
 
    FILE *fp;
    int dt = 1234;
 
    if((fp=fopen("myfile1.txt", "w")) == NULL){
        printf("file cannot open.\n");
        return 1;
    }
 
    fputs("char output\n", fp);
    fputc('A', fp);
    fputc('\n', fp);
    fprintf(fp, "dt=%d\n", dt);
 
    fclose(fp);
 
    return 0;
}

ファイルコピー

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
int main(void){
 
    FILE *fin, *fout;
    char infile[80], outfile[80], ss[256];
 
    printf("inputfile="); gets(infile);
    printf("outputfile="); gets(outfile);
 
    if((fin=fopen(infile, "r")) == NULL){
        printf("cannot open input file.\n");
        return 1;
    }
    if((fin=fopen(outfile, "w")) == NULL){
        printf("cannot open output file.\n");
        return 1;
    }
 
    while(fgets(ss, 256, fin) != NULL){
        fputs(ss, fout);
    }
 
    fclose(fin);
    fclose(fout);
 
    return 0;
}

### コマンドラインから引数を渡す

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
int main(int argc, char *argv[]){
 
    FILE *fin, *fout;
    char ss[256];
 
    if(argc != 3){
        printf("引数の数が異なります\n");
        return 1;
    }
 
    if((fin=fopen(argv[1], "r")) == NULL){
        printf("cannot open inputfile\n");
        return 1;
    }
    if((fin=fopen(argv[2], "w")) == NULL){
        printf("cannot open outputfile\n");
        return 1;
    }
 
    while (fgets(ss, 256, fin) != NULL){
        fputs(ss, fout);
    }
 
    fclose(fin);
    fclose(fout);
 
    return 0;
}

argv[0]はコマンド名そのもの。
argcは全ての引数、argv[]は対応する引数

1
2
3
4
5
6
7
8
9
10
int main(int argc, char *argv[]){
 
    if(argc != 3) return 1;
    printf("argc =%d\n", argc);
    printf("argv[0] =%s\n", argv[0]);
    printf("argv[1] =%s\n", argv[1]);
    printf("argv[2] =%s\n", argv[2]);
 
    return 0;
}