画像(logo)

HOME/[C言語 入門]小学生でもわかるC言語3 目次/三日目 ファイル書き込み

広告

[C言語 入門 小学生でもわかるC言語3]
三日目 ファイル書き込み

広告

↓発売日:2018年09月22日↓

たった1日で基本が身に付く! C言語 超入門

新品価格
¥2,225から
(2018/10/8 23:10時点)

目次へ戻る

ファイル書き込み

今回はファイルにデータを書き込んでみます。

手始めに「test.txt」に「99999」というデータを書き込んでみます。

当たり前ですがもとの内容は書き換えられてしまうのでご注意ください。

/*三日目 プログラム1*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int main(){
	int ary[5] = {57,57,57,57,57};
	int count = 0;
	FILE *fp;

	fp = fopen("test.txt", "w");
	if (fp == NULL){
		printf("ファイルオープン失敗\n");
		exit(1);
	}

	for(count = 0;count < 5;count++){
		fputc(ary[count],fp);
	}

	fclose(fp);
	return 0;
}

実行してからファイルを開いて内容を確認してみてください。

「test.txt」

画像(ci_3_1)

「99999」という内容に書き換わっているのが確認できますね!

プログラムの内容を見てみましょう!

int ary[5] = {57,57,57,57,57};

まず書き込む内容がこちらになります。

前回と同じ考え方で数字の「9」に「48」を足した「57」を書き込めば文字の「9」として書き込まれますね!

fp = fopen("test.txt", "w");

そしてファイルオープンの時に書き込みモードの「w」を指定します。

ちなみにここを「a」に指定した場合はそれまで残っていたファイルの内容に継ぎ足すようなカタチでファイルに書き込まれます。

そしていよいよファイルに書き込んでいくワケですが、今回は「fputc()」という関数を使って書き込んでみました。

fputc(書き込む内容,ファイルポインタ);

これは「fgetc()」の書き込みバージョンとでも言う感じのもので、動きも実行する毎に、一文字書き込んだら次に進み、一文字書き込んだら次に進み、といった具合に同じような動作になります。

for(count = 0;count < 5;count++){
	fputc(ary[count],fp);
}

ファイル読み込みの時はファイルの終わりという目印がありましたが、配列は終わりみたいな目印はないので自分で書き込む回数を指定してあげなければいけません。

文章を書き込み

/*三日目 プログラム2*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int main(){
	char str[128] = "this\nis\na\npen";
	int count = 0;
	FILE *fp;

	fp = fopen("test.txt", "w");
	if (fp == NULL){
		printf("ファイルオープン失敗\n");
		exit(1);
	}

	for(count = 0;count < 13;count++){
		fputc(str[count],fp);
	}

	fclose(fp);
	return 0;
}

「test.txt」

画像(ci_3_2)

今度は文章を書き込んでみた例です。

もし改行したい場合は改行コード「\n」を入れて改行をします。

改行コード「\n」は一文字分になるトコロに注意です。

/*三日目 プログラム3*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int main(){
	char str[128] = "あいうえお";
	int count = 0;
	FILE *fp;

	fp = fopen("test.txt", "w");
	if (fp == NULL){
		printf("ファイルオープン失敗\n");
		exit(1);
	}

	for(count = 0;count < 10;count++){
		fputc(str[count],fp);
	}

	fclose(fp);
	return 0;
}

「test.txt」

画像(ci_3_3)

ひらがなの場合ですね。

ひらがなは全角文字なので二文字分必要になります。

/*三日目 プログラム4*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
	char str[128] = "今日の献立 (2017/2/24)\n\nごはん\n味噌汁\n焼き鮭\n味付けのり\n納豆";
	int count = 0;
	FILE *fp;

	fp = fopen("test.txt", "w");
	if (fp == NULL){
		printf("ファイルオープン失敗\n");
		exit(1);
	}

	for(count = 0;count < strlen(str);count++){
		fputc(str[count],fp);
	}

	fclose(fp);
	return 0;
}

「test.txt」

画像(ci_3_4)

文字列の長さを取得するのにヘッダファイル「string.h」にある「strlen()」関数を使ってみるのもいいかもしれません。

int len;
len = strlen(文字列)

これで文字列の長さが変数「len」に入ります。

ただ全角、半角が一緒に混ざるような文章では正確ではない場合もあるそうなので注意が必要です。

広告

データファイル

/*三日目 プログラム5*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int main(){
	int ary[3][5] = {
		{777,64,78,111,4},
		{123,1,457,21,1},
		{52,13,77,4325,241}
	};
	char tmp[20];
	int i,j;
	int index = 0;
	FILE *fp;

	fp = fopen("test2.txt", "w");
	if (fp == NULL){
		printf("ファイルオープン失敗\n");
		exit(1);
	}

	for(i=0;i<3;i++){
		for(j=0;j<5;j++){
			_itoa(ary[i][j],tmp,10);
			index = 0;
			while(1){
				if(tmp[index] == '\0' && j < 4){
					fputc(',',fp);
					break;
				}
				else if(tmp[index] == '\0' && j == 4 && i < 2){
					fputc('\n',fp);
					break;
				}
				else if(tmp[index] == '\0' && j == 4 && i == 2){
					break;
				}
				else{
					fputc(tmp[index],fp);
					index++;
				}
			}
		}
	}

	fclose(fp);

	return 0;
}

「test2.txt」

画像(ci_3_5)

いくつかの数字を「,」コンマで区切って書き込んでみました。

前回読み込んだ簡単なデータファイルを逆に書き込んだ感じですね!

数字→文字列の変換には「_itoa()」という関数を使います。

_itoa(元の数字,保存する文字配列,10);

こんな感じで使います。

最後の引数の「10」というのは基数(10進数とか2進数の数字の部分)を入れるのですがとりあえず「10」を入れれば普通の数字に変換されます。

標準関数ではないのでたまにコンパイラによってはサポートされていない場合もあるので注意です。

そして文字列に変換された数字を調べて、そこが「\0」だったら、文字列の終わりの部分だったら「,」コンマもしくは改行、そうではなかったらその部分をファイルにそれぞれ書き込むような処理をしております。

このプログラムでは数字5個書き込んだら次の行へと決まってしまっているので、汎用的にするには少しそのあたりの工夫が必要です。

コピープログラム

では今までの事を合わせて簡単なコピープログラムを作ってみます!

ファイル名「test.txt」の内容をファイル名「test2.txt」にコピーしてみます。

/*三日目 プログラム6*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int main(){
	int get_c;
	FILE *fp;
	FILE *fp2;

	fp = fopen("test.txt", "r");
	if (fp == NULL){
		printf("ファイルオープン失敗\n");
		exit(1);
	}

	fp2 = fopen("test2.txt", "w");
	if (fp == NULL){
		printf("ファイルオープン失敗\n");
		exit(1);
	}

	while (1){
		get_c = fgetc(fp);
		if (!feof(fp))fputc(get_c,fp2);
		else break;
	}

	fclose(fp);
	fclose(fp2);
	return 0;
}

「test2.txt」

画像(ci_3_6)

「test2.txt」の中身を確認すると・・・。

「test.txt」の内容がコピーされてますね!

コピー元のファイルとコピー先のファイルの2つをオープンして

while (1){
	get_c = fgetc(fp);
	if (!feof(fp))fputc(get_c,fp2);
	else break;
}

読み込んだデータをそのまま書き込むだけですね!

最後にクローズも2つ分行うので注意です!

次回は文字列を中心としたファイルの読み書きについて見ていきたいと思います。

次回

四日目 ファイル読み書き(文字列)

□ページの先頭へ□

□目次へ戻る□

□HOME□

広告

↓発売日:2016年02月29日↓

12歳からはじめる ゼロからのC言語 ゲームプログラミング教室

新品価格
¥2,462から
(2018/10/8 23:25時点)

↓発売日:2018年06月22日↓

スッキリわかるC言語入門

新品価格
¥2,916から
(2018/10/8 23:15時点)

↓発売日:2018年03月09日↓

C言語本格入門 ~基礎知識からコンピュータの本質まで

新品価格
¥3,218から
(2018/10/8 23:16時点)

↓発売日:2017年06月14日↓

やさしいC 第5版 (「やさしい」シリーズ)

新品価格
¥2,700から
(2018/10/8 23:17時点)

↓発売日:2018年05月21日↓

作って身につく C言語入門

新品価格
¥2,462から
(2018/10/8 23:18時点)

↓発売日:2017年12月07日↓

新・標準プログラマーズライブラリ C言語 ポインタ完全制覇

新品価格
¥2,678から
(2018/10/8 23:19時点)

↓発売日:2017年02月08日↓

新・明解C言語で学ぶアルゴリズムとデータ構造 (明解シリーズ)

新品価格
¥2,700から
(2018/10/8 23:20時点)

↓発売日:2017年09月26日↓

かんたん C言語 [改訂2版] (プログラミングの教科書)

新品価格
¥2,916から
(2018/10/8 23:22時点)