広告
↓発売日:2018年09月22日↓
![]() |
新品価格 |
今回は文字列を中心としたファイル読み書きを見ていきたいと思います。
/*四日目 プログラム1*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main(){
char str[128] = "good morning!!!";
FILE* fp;
fp = fopen("test.txt", "w");
if (fp == NULL){
printf("ファイルオープン失敗\n");
exit(1);
}
fputs("月火水木金土日\n",fp);
fputs(str,fp);
fclose(fp);
return 0;
}
まずはシンプルにファイルに内容を書き込む「fputs()」です。
fputs("書き込みたい文字列",ファイルポインタ);
書き込むファイルポインタと文字列を設定するだけでシンプルに書き込みます。
/*四日目 プログラム2*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main(){
char str[128];
char str2[128];
char str3[128];
FILE* fp;
fp = fopen("test.txt", "r");
if (fp == NULL){
printf("ファイルオープン失敗\n");
exit(1);
}
fgets(str,128,fp);
printf("%s\n",str);
fgets(str2,6,fp);
printf("%s\n",str2);
fgets(str3,128,fp);
printf("%s\n",str3);
fclose(fp);
return 0;
}
続いて改行まで指定したバイト分読み込む「fgets()」になります。
前に書き込んだ内容を読み込んでおります。
fgets(読み込み先,指定バイト,ファイルポインタ);
実行結果から見てもわかるようにこの関数は改行までを指定バイト読み込みます。(改行コードも含めて読み込みます!)
なのでどんなに大きな容量を指定しても改行で読み込みは止まります。
ただ、後ほど紹介する「fscanf()」関数で「%s」指定をした時のようにホワイトスペースで読み込みを止めたりしないので例えば
2017/03/04 (天気:晴れ)
のように途中スペースを挟んだり、文字列と数値が混在しているようなデータを一気に読み込みたい時に便利です。
広告
/*四日目 プログラム3*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main(){
FILE* fp;
fp = fopen("test.txt", "w");
if (fp == NULL){
printf("ファイルオープン失敗\n");
exit(1);
}
fprintf(fp,"東京特許許可局!!!\n");
fclose(fp);
return 0;
}
次は「printf()」のファイル版とも言うべき「fprintf()」になります。
この関数の最大の特徴は「printf()」関数と同じように「%c,%d,%s」などフォーマットを指定して書き込む事ができます。
/*四日目 プログラム4*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main(){
char str[128] = "good afternoon!!!";
int ary[5] = {1,2,3,4,5};
int ary2[5] = {65,66,67,68,69};
int count;
FILE* fp;
fp = fopen("test.txt", "w");
if (fp == NULL){
printf("ファイルオープン失敗\n");
exit(1);
}
fprintf(fp,"good morning!!!\n");
fprintf(fp,"%s\n",str);
for(count = 0;count < 5;count++){
fprintf(fp,"%d ",ary[count]);
}
fprintf(fp,"\n");
for(count = 0;count < 5;count++){
fprintf(fp,"%c ",ary2[count]);
}
fclose(fp);
return 0;
}
これを使えば多彩な書き込み方ができますね!
/*四日目 プログラム5*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main(){
char str[128];
FILE* fp;
fp = fopen("test.txt", "r");
if (fp == NULL){
printf("ファイルオープン失敗\n");
exit(1);
}
(void)fscanf(fp,"%s",str);
printf("%s\n",str);
fclose(fp);
return 0;
}
最後にさきほども少し言いました「scanf()」のファイル版「fscanf()」になります。
「scanf()」同様に「%c,%d,%s」などフォーマットを指定して読み込む事ができます。
できるのですが、「scanf()」同様にホワイトスペースで読み込みを辞める、異なるフォーマット指定子を指定すると正常に読み込まないなど使いこなすには注意が必要になります。
/*四日目 プログラム6*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main(){
char str[128];
int a;
char c;
int count;
FILE* fp;
fp = fopen("test.txt", "r");
if (fp == NULL){
printf("ファイルオープン失敗\n");
exit(1);
}
for(count = 0;count < 4;count++){
(void)fscanf(fp,"%s",str);
printf("%s\n",str);
}
for(count = 0;count < 5;count++){
(void)fscanf(fp,"%d",&a);
printf("%d ",a);
}
for(count = 0;count < 11;count++){
(void)fscanf(fp,"%c",&c);
printf("%c",c);
}
printf("\n");
fclose(fp);
return 0;
}
前に書き込んだ内容を読み込んでみました。
「%d」指定では数字の個数分読み込めば大丈夫ですが、一文字一文字独立したものを「%c」で読み込みたい場合はホワイトスペースも一文字とカウントされるので読み込む回数も文字数+スペースになります。
もちろん使いこなせば相当複雑な読み込みもできるので大変便利ですが、いろいろ注意点も多いのでもし自信がない場合は前回のように「fgetc()」などを使って一文字一文字地道に読み込んでいった方が無難かと思われます。
では次回はいったんファイル処理から離れて、そのファイル処理に必要な基礎知識、入出力に関する事と変数のサイズなどを調べたいと思います。
広告
↓発売日:2016年02月29日↓
![]() |
12歳からはじめる ゼロからのC言語 ゲームプログラミング教室 新品価格 |
↓発売日:2018年06月22日↓
![]() |
新品価格 |
↓発売日:2018年03月09日↓
![]() |
新品価格 |
↓発売日:2017年06月14日↓
![]() |
新品価格 |
↓発売日:2018年05月21日↓
![]() |
新品価格 |
↓発売日:2017年12月07日↓
![]() |
新品価格 |
↓発売日:2017年02月08日↓
![]() |
新・明解C言語で学ぶアルゴリズムとデータ構造 (明解シリーズ) 新品価格 |
↓発売日:2017年09月26日↓
![]() |
新品価格 |