出力とは printf の書式指定 書式指定 意味 例 d 整数 小数のついていない数 1 2 3 45 f 実数 小数のついている数 01 10 22 c ID: 810995
Download The PPT/PDF document "前回の復習 p rintf をさらに詳..." is the property of its rightful owner. Permission is granted to download and print the materials on this web site for personal, non-commercial use only, and to display it on your personal computer provided you do not modify the materials and that you retain all copyright notices contained in the materials. By downloading content from our website, you accept the terms of this agreement.
Slide1
前回の復習
Slide2p
rintf
をさらに詳しく
出力とは
Slide3printf
の書式指定
書式指定
意味
例
%d
整数
(小数のついていない数)
1, 2,
3,
-45
%f
実数
(小数のついている数)
0.1, 1.0,
2.2
%c
1
文
字
(
'
で囲まれた半角文字
1
個)
'a', 'A'
%s
文字列
(
"
で囲まれた文字)
"A", "ABC",
"
あ
"
Slide4型
とは、変数のカタチ
Slide5変数
C
言語の変数を詳しく説明します
Slide6整数型
型の名前
入る値の範囲
サイズ
(ビット数)
int
システムによる
-
unsigned
int
システムによる
-
long
-2147483648
~
2147483647
32(64)
unsined
long
0
~
4294967295
32(64)
short
-32768
~
32767
16
unsined
short
0
~
65535
16
char
-128
~
127
8
unsined
char
0
~
255
8
Slide7実数型
型の名前
入る値の範囲
サイズ
(ビット数)
float
-3.4×10
38
~
3.4×10
38
32
double
-1.7×10
308
~
1.7×10
308
64
Slide8printf
がややこしい!
printf
%d
%f
%s
128
0.9
"ABC"
とりあえずは
%d
、
%f
、
%s
を覚えておく!
Slide9printf
の表示桁指定
printf
%
全体の桁数
.
小数の桁数
d, f
など
0
を入れると
0
が追加される
%lf
は
%f
の2倍の小数表現ができる
Slide10整数(
int
)型とは
0
1
1
0
0
1
0
0
2
7
2
6
2
5
2
4
2
3
2
2
2
1
2
0
128
64
32
16
8
4
2
1
パソコンのメモリ上
64
32
4
100
i
nt
a = 100;
Slide11浮動小数点
(
float
)型
とは
正負
小数の桁数
(指数部)
各桁の数値
(仮数部)
パソコンのメモリ上
全体で
32bit
、
64bit
-5
256
2.56×10
-5
float
a = 0.0000256;
Slide12固定小数点だと
1
0
0
0
0
0
0
0
.
0
a
=
0
.
0
0
0
0
0
0
0
1
b=
固定
a
+ b
をしたとき
bit
サイズによって
桁落ち
する
bi
t
サイズ
Slide13文字列とは配列
Slide14文字型(
1
文字のとき)
文字は
0〜127
の番号の
ASCII
コードで表す
char
は
-128〜127
の整数だが、
C
言語では文字と文字コード(
0〜127)を同等とみなす'A'は数値の
65と同じである
Slide15Slide16文字列(複数文字のとき)
文字列は文字の集まり、
配列
で表す
ダブルクォート
"
は
文字列、シングルクォート
'
は1文字を表す
c
har s
[6]
の配列で
5
文字を表すことができる
Slide17文字列は配列
c
har m[6] = "Hello";
‘\0’
NULL
文字
Slide18日本語は気をつける!
#include <
stdio.h
>
int
main(void){
char a[3] = "
あ
";
char m[11] = "
こんにちは
";
printf
("%s \n", a);
printf
("%s \n", m);
return 0;
}
日本語は全角(
2
バイト)なので、配列の個数は
2倍
になる
Slide19よく間違える、文字の代入
c
har a = 'A';
a = 'B';
p
rintf
("%c ¥n", a);
c
har a[6] = "Hello";
a = "Good!";
p
rintf
("%s ¥n", a);
文字列をそのまま
代入することはできない
Slide20実行してみる
①(
strcpy
_s
)
#include <
stdio.h
>
#include <
string.h
>
int
main(void){
char m[
10
] = "Hello";
printf
("%s \n", m);
strcpy_s
(m, 10, "Good bye!");
printf
("%s \n", m);
return 0;
}
strcpy_s
()
を使うためのヘッダファイル
文字列を代入する
ための関数
‘\0’
もコピーする
ので文字列a はその分も考えて大きさを宣言すること
Slide21実行
してみる
②
(
memcpy
)
#include <
stdio.h
>
#include <
string.h
>
int
main(void){
char m[
10
] = "Hello";
printf
("%s \n", m);
memcpy
(m, "Good bye!", 10);
printf
("%s \n", m);
return 0;
}
memcpy
()
を使うためのヘッダファイル
メモリをコピー
する
ための関数
第3引数のバイト数だけのすべての配列をコピーする
Slide22s
trcpy
_s
の
’\0’
#include <
stdio.h
>
#include <
string.h
>
int main(void) {
char a[10] = "
abc
\0
def";
char b[10] = "123
\0
456";
strcpy_s
(a, 10, b);
for(int
i
= 0;
i
< 10;
i
++)
printf
("%c", a[
i
]); return 0;}‘\0’NULL文字
Slide23memcpy
の
’\0’
#include <
stdio.h
>
#include <
string.h
>
int main(void) {
char a[10] = "
abc
\0
def";
char b[10] = "123
\0
456";
memcpy
(a, b, 10);
for(int
i
= 0;
i
< 10;
i
++)
printf
("%c", a[
i
]);
return 0;
}‘\0’NULL文字
Slide24どちらも配列をコピーしている
"
abc
\0
def"
"123
\0
456"
a
b
"123
\0
"
"123
\0
456"
a
b
s
trcpy_s
"
abc
\0
def"
"123
\0
456"
a
b
"123
\0
456"
"123
\0 456"abmemcpy
\0まで
指定した個数
すべて
Slide25s
trcpy_s
と
memcpy
どちらを使っても良い
‘\0’
をどうするかで判断すること
Slide26s
trcpy
もあるが
MS
が推奨していない
s
trcpy_s
を使うこと
#define _CRT_SECURE_NO_WARNINGS
があれば使える
Slide27文字列は配列
c
har m[6] = "Hello";
‘\0’
NULL
文字
何もしなくても文字列を代入すれば
’\0’
はつく!
Slide28C
言語でいう
s
ize
とは
Slide29b
it
と
byte
(
sizeof
演算子)
1
0
1
0
1
0
1
0
8
ビット=
1
バイト
1
ビット
sizeof
演算子
を使うと、
バイト数
がわかる
Slide30型の変換
<
誤>
3
÷
2の結果を求める
<正>
3
÷
2の結果を求める
3
(
整数
)
/ 2
(
整数
)
答え↓ 1(
整数で小数の切り捨て)
3.0(実数) / 2.0
(
実数
)
答え↓
1.5
(
実数
)
正確な計算をするためには
型を統一しなければならない
Slide31暗黙の変換
異なる型が現れたときは、
精度の高い型に統一される
Slide32m
emcpy
のバイトサイズ
Slide33memcpy
での
バイトサイズ
#include <
stdio.h
>
#include <
string.h
>
int
main(void){
char
m[
10
] = "Hello";
printf
("%s \n", m);
memcpy
(m, "Good bye!",
10
);
printf
("%s \n", m);
return 0;
}
バイトのサイズを入れなければならない
char
は
1
バイト
i
ntだった場合、システムによってバイトサイズが変わってくる配列の個数でいい
Slide34i
nt
だった
とき
#include <
stdio.h
>
#include <
string.h
>
int main(void) {
int
m[10] = {11,12,13,14,15,16,17,18,19,20};
int
n[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
memcpy
(m, n,
10 *
sizeof
(int)
);
for (int
i
= 0;
i
< 10;
i
++)
printf
("%d", m[
i
]); return 0;}strcpy_sは文字列専用の関数で、char型でしか使えないシステムに関係なくmemcpyが使える
Slide35結局
m
emcpy
がやっていること
#include <
stdio.h
>
#include <
string.h
>
int main(void) {
int m[10] = { 11,12,13,14,15,16,17,18,19,20 };
int n[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
for (int
i
= 0;
i
< 10;
i
++)
m[
i
] = n[
i
];
for (int
i
= 0;
i
< 10;
i
++)
printf
("%d", m[i]); return 0;}memcpy
Slide36キャスト
Slide37キャスト演算子(明示的変換)
int
float
1
1.0
(float)
型キャスト
Slide38実行してみる①
#include <
stdio.h
>
int
main(void){
int
a = 3;
int
b = 2;
float f;
f =
(float)
a / b;
printf
("
3
÷
2=
%f\n", f);
return 0;
}
Slide39実行してみる②
#include <
stdio.h
>
int
main(void){
printf
("
3
÷
2=
%f\n", 3 / (float)2);
return 0;
}
Slide40演算子の優先順位
Slide41複雑な式になって優先順位が
わからなかったら
…
適度な位置に
( )
を使う!
Slide42型の再定義
Slide43実行してみる
#include <
stdio.h
>
int
main(void) {
typedef
unsigned char
u_char
;
u_char
c;
c = 100;
printf
("%d \n", c);
return 0;
}
Slide44型の名前を変更する
型の名前は「
unsigned char
」などを組み合わせると、長くなる。そんなとき
typedef
を使うと、任意の名前を付けることができる
typedef
unsigned char
u_char
既存の型名
新しい
型名
自由に名前を付けなおせる
Slide45マクロ
(
値を定義
)
#
から始まる命令文
#
define
Slide46不変
の値、定数①
(
#define
)
#include <
stdio.h
>
#define PI 3.14
int
main(void) {
int
r = 5;
printf
("%f \n", r * r *
PI
);
return 0;
}
main.c
3.14
に置き換わる
Slide47不変
の値、定数②
(
#define
)
#include <
stdio.h
>
#define PI 3.14
int
main(void) {
int
r = 5;
PI = 3;
printf
("%f \n", r * r * PI);
return 0;
}
main.c
エラーになる
Slide48#define
の書き方
#define LOOPNUM 10
スペース
セミコロンは
いらない
大文字
セミコロン自体が値になってしまう
Slide49不変の変数
enum
(定数)①
#include <
stdio.h
>
enum
{
aiu
,
eo
,
kakiku
,
keko
};
int
main(void) {
printf
("%d, %d \n",
aiu
,
eo
);
printf
("%d, %d \n",
kakiku
,
keko
); return 0;}0,1,2…と定数が代入される
Slide50不変の変数
enum
(定数)②
#include <
stdio.h
>
enum
{
aiu
,
eo
= 5,
kakiku
,
keko
= 6
};
int
main(void) {
printf
("%d, %d \n",
aiu
,
eo
);
printf
("%d, %d \n",
kakiku
,
keko); return 0;}別の定数に代入することもできる
Slide51マクロ
(関数の詳細は次々回くらいになる)
#
から始まる命令文
#
define
する簡易関数
Slide52簡易関数①(
#define
)
#include <
stdio.h
>
#define
HIKU(
x,y
) ((x) - (y))
int
main(void) {
printf
("%d \n",
HIKU(5,3)
);
return 0;
}
main.c
実行してみよう!
Slide53簡易関数②(
#define
)
#include <
stdio.h
>
#define
HIKU(
x,y
) ((x) - (y))
int
main(void) {
printf
("%d \n",
HIKU(5+2,1+3)
);
return 0;
}
main.c
実行してみよう!
Slide54簡易関数③(
#define
)
#include <
stdio.h
>
#define
HIKU(
x,y
) (x - y)
int
main(void) {
printf
("%d \n",
HIKU(5+2,1+3)
);
return 0;
}
main.c
違いを確認しよう!
Slide55簡易関数④(
#define
)
#include <
stdio.h
>
#define PRINTM(X)
printf
("%d\n", X)
int
main(void) {
PRINTM(10);
return 0;
}
main.c
実行してみよう!
Slide56復習はここまで
Slide574.
プログラミング応用
制御と繰り返しと
色々
Slide58制御文
if
文
switch
文
基本的な使い方は
JavaScript
と同じ
プログラムの
流れを変える
制御構造
Slide59if
文
「
条件式
の値が
真
(1)
ならば、
{ 〜 }
の中の文を処理する」というもの。逆に、
偽
(0)
ならば処理ない。
if(
条件式
){
文(いくつでも)
}
Slide60int
a = 18;
if(a >= 20){
printf
("%d
は
20
以上です
\n", a);
}else if(a >= 15){
printf
("%d
は
15
以上です
\n", a);
}else if(a >= 10){
printf("%d
は10以上です
\n", a);
}else if(a >= 5){
printf
("%d
は
5
以上です
\n", a);
}else{
printf
("%d
は5より小さいです\n", a);}else ifやelseを使うと以下のようなことができます。
Slide61プログラムの書き方
プログラムは書き方が必ずしも1つとは
限らない
。
if
文
は英語の意味の通り「もし~だったら…する」という
条件分岐
を作る制御文で
ある
。
条件
が「成り立った場合」と「成り立たなかった場合」の2通りのプログラムの
流れ
を用意することができる
のである。プログラムの流れを必要に応じて変えていくことによって、自分の思うままにプログラムを動かすことが可能にな
る。
Slide62s
witch
文
int
num
= 2;
switch(
num
){
case 1:
printf
("
1です
\n");
break;
case 2:
printf
("2です
\n"); break;
case 3:
printf
("
3です
\n");
break;
default:
printf
("
1~3までの数字だけです!
\n");
break;}
Slide63switch
~
case
~
break
~
default
switch
文
は複数の
case
という選択肢の中から
式の値に合うもの
(
真)を選び、その処理を実行します。式の値がcaseの
どれにも当てはまらない(偽)ときはdefaultに進みます。
各選択肢の最後にはbreak文を記述し、選択した処理のみを行うようにします。
Slide64実行してみよう
int
month = 7;
if((month == 12) || (month == 1) || (month == 2)){
printf
("
冬
\n");
}else if((month >= 3) && (month <= 5)){
printf
("
春
\n");
}else if((month >= 6) && (month <= 8)){
printf
("
夏
\n");}else if((month >= 9) && (month <= 11)){
printf
("
秋
\n");
}else{
printf
("
1から12の値を入力してください
\n");
}
Slide65制御文は
C
言語も
JavaScript
も同じ
普通に使っていきましょう!
Slide66繰り返し(反復処理)
for
文
while
文
do
~
while
文
プログラムの
処理
を
繰り返す
制御構造
基本的な使い方は
JavaScriptと同じ
Slide67実行してみよう
int
wa
=0;
int
seki
=1;
for(
int
i
=1;
i
<= 10;
i
++){
wa
+= i
; seki
*=
i
;
}
printf
("
和は
%d
積は
%d \n",
wa
,
seki
);
Slide68for
文
for(
初期化式
;
条件式
;
制御変数の更新
){
処理
}
Slide69実行してみよう
int
wa
=0;
int
seki
=1;
int
i
=1;
while(
i
<= 10){
wa
+=
i
;
seki *= i
;
i
++;
}
printf
("
和は
%d
積は
%d \n",
wa
,
seki);実行結果は同じ、forがwhileになっただけ
Slide70while
文
while(
条件式
){
処理
}
Slide71実行してみよう
int
wa
=0;
int
seki
=1;
int
i
=1;
do{
wa
+=
i
;
seki *=
i;
i
++;
} while(
i
<= 10);
printf
("
和は
%d
積は
%d \n",
wa
,
seki);実行結果は同じ、forがdo~whileになっただけセミコロンを気を付ける
Slide72do
~
while
do{
処理
}while(
条件式
)
Slide73ループの中断
break
→ ループから抜ける
continue
→ ループを1回スキップする
Slide74for(
int
j=0; j < 3;
j++
){
for(
int
i
=0; i < 3;
i
++){
printf
( "%d + %d = %d \n",
i
, j,
i
+ j);
}
}
for(
int
j=0; j < 3;
j++
){
for(
int
i
=0;
i
< 3;
i++){ if(i + j == 1) break; printf( "%d + %d = %d \n", i , j, i + j); }}
Slide75for(
int
j=0; j < 3;
j++
){
for(
int
i
=0; i < 3;
i
++){
if(
i
+ j == 1)
continue;
printf
( "%d + %d = %d \n",
i
, j,
i
+ j);
}
}
for(
int
j=0; j < 3;
j++
){
for(
int
i=0; i < 3; i++){ if(i + j == 1) break; printf( "%d + %d = %d \n", i , j,
i + j);
}
}
Slide76すべてのループから抜け出す場合は
以下のようにします。
このように
ラベル(
label
)
を指定
して
goto
することで外側のループも抜け出すことができます。
ラベルの名前も変数と同じように自分で好きに命名できます。
for(
int
j=0; j < 3;
j++
){
for(
int
i
=0;
i
< 3;
i
++){
if(
i
+ j == 1)
goto
label;
printf
( "%d + %d = %d \n", i , j, i + j); }}label:
Slide77繰り返しも
C
言語と
JavaScript
は同じ
goto
文だけ気を付ける
Slide78関数群
Slide79math.h
の数学関数を使う
使い方
働き
意味
int
n =
abs
(m);
整数の絶対値
n = |m|
double a =
fabs
(x);
実数の絶対値
a = |x|
double a =
sqrt
(x);
平方根a =
√x
double a = exp(x);eの指数
a = e
x
double a =
log
(x);
自然対数
a = log x
double a =
log10
(x);
常用対数
a = log
10
x
Slide80使い方
働き
意味
double a =
pow
(x, y);
べき乗
a =
x
y
double a =
sin
(x);
サイン
a = sin x
double a =
cos
(x);
コサイン
a = cos x
double a = tan(x);
タンジェントa = tan xdouble a =
ceil
(x);
小数切り上げ
実数
x
を切り上げ
double a =
floor
(x);
小数切り捨て
実数
x
を切り捨て
double a = rint(x);四捨五入実数xを四捨五入
Slide81実行してみる
①
#include <
stdio.h
>
#include <
math.h
>
int
main(void){
printf
("%d, %f \n", abs(-123), fabs(-0.123));
printf
("%f, %f \n", sqrt(2.0), exp(1.0));
printf
("%f, %f \n", log(2.7), log10(100.0));
return 0;
}
絶対に
必要
Slide82実行してみる②
#include <
stdio.h
>
#include <
math.h
>
int
main(void){
printf
("%f \n", pow(2,3));
printf
("sin30° = %f \n", sin(30 * 3.14 / 180));
printf
("cos60° = %f \n", cos(60 * 3.14 / 180));
printf
("tan90° = %f \n", tan(90 * 3.14 / 180));
return 0;
}
気を付ける
Slide83実行してみる③
#include <
stdio.h
>
#include <
math.h
>
int
main(void){
double a = 1234.5678;
printf
("%f \n", ceil(a));
printf
("%f \n", floor(a));
printf
("%f \n",
rint
(a));
printf
("%d \n", (int)a);
return 0;
}
気を付ける
Slide84time.h
の時間関数を使う
#include <
stdio.h
>
#include <
time.h
>
int
main(void){
printf
("%
lld
\n", time(NULL));
printf
("%
lld
年
\n", time(NULL)/60/60/24/365);
return 0;
}
絶対に
必要
NULL
に気を付ける
実行すると
1970
年
1
月
1
日0時0分0秒から計った現在の時間を秒単位で返す
Slide85疑似
乱数
rand()
を使う
#include <
stdio.h
>
#include <
stdlib.h
>
int
main(void){
printf
("%d \n", rand());
printf
("%d \n", rand()%10 + 1);
return 0;
}
絶対に
必要
Slide86あれれ? おかしいな
…
#include <
stdio.h
>
#include <
stdlib.h
>
int
main(void){
for(
int
i
=0;
i
< 10;
i
++)
printf
("%d \n", rand()%10 + 1);
return 0;
}
何度も実行してみるとすべて
結果が
同じ
(
F5
を連打してみる)
Slide87乱数表を再設定する
srand
()
#include <
stdio.h
>
#include <
stdlib.h
>
#include <
time.h
>
int
main(void){
srand
(time(NULL));
for(
int
i
=0;
i
< 10;
i
++)
printf
("%d \n", rand()%10 + 1);
return 0;
}
何度実行して
もランダム!
追加する
Slide88ファイル操作
Slide89ファイルを扱う手順
ファイルポインタ
を宣言
対象のファイルを開き、
ファイルポインタ
を得る
ファイルポインタ
を通して
読み書き
する
操作が終わったら、ファイルを閉じる
Slide90ファイルポインタ
FILE *
fp
;
ポインタとして宣言
する
このファイルポインタはファイルを扱うための識別子として使うだけなので、
通常のポインタ特有の使い方はできない
ので注意する
Slide91ファイルの開閉
以下のプログラムを実行してみてください。
#include <
stdio.h
>
int
main(void) {
FILE *
fp
;
fp
=
fopen
("text.txt", "w");
fclose
(
fp
);
return 0;
}
中身がカラッポな
text
というテキストファイルができる
Slide92fopen
関数の意味
fp
=
fopen
(
"text.txt", "w"
);
ファイルポインタ
「
*
」
はつけない
ファイル名
モード
Slide93モードとは?
モードの文字列
目的
ファイルがないとき
r
読み込み
失敗
r+
読み書き
失敗
w
書き込み
空ファイルを作る
w+
読み書き
空ファイルを作る
a
追加書き込み
ないときだけ作る
a+
読み書き
ないときだけ作る
Slide94fclose
は必要?
一見、無意味な
fclose
関数だがしっかりとした役割がある。
f
open
でファイルを
オープン
にするとき、
他の
プログラムで勝手に読み書きされないように
プロテクトがかかっている
。
f
closeでファイルをクローズすることで、そのプロテクトが外れる
。fclose関数を使って初めてファイルに書き込むことで処理の高速化
をしている。
Slide95ファイルへの書き込み
#include <
stdio.h
>
int
main(void) {
FILE *
fp
;
fp
=
fopen
("text.txt", "w");
fprintf
(
fp
, "Hello, World!");
fclose
(
fp
);
return 0;
}
text
というテキストファイルに
Hello, World!
が書き込まれる
Slide96printf
のように
使える
#include <
stdio.h
>
int
main(void) {
int
i
= 100;
FILE *
fp
;
fp
=
fopen
("text.txt", "w");
fprintf
(
fp
, "%d",
i
);
fclose
(
fp
);
return 0;
}textというテキストファイルに変数iの値が書き込まれる
Slide97普通に
printf
のように
使える
#include <
stdio.h
>
int
main(void) {
double
i
= 0.005;
FILE *
fp
;
fp
=
fopen("text.txt", "w");
fprintf
(
fp
, "%.7f",
i
);
fclose
(
fp
);
return 0;}textというテキストファイルに実数も書き込める
Slide98"a"
の追加書き込み
#include <
stdio.h
>
int
main(void) {
double
i
= 0.005;
FILE *
fp
;
fp
=
fopen
("text.txt", "
a
");
fprintf
(
fp
, "%.7f",
i
);
fclose
(
fp
); return 0;}実行するたびにファイルに書き加えられる
Slide99ファイルの読み込み
#include <
stdio.h
>
int
main(void) {
int
i
;
FILE *
fp
;
fp
=
fopen
("text.txt", "
r
");
fscanf
(
fp
, "%d", &
i
);
fclose
(
fp
);
printf("%d \n", i); return 0;}textというテキストファイルの整数が読み込まれる
Slide100モードが
"r"
のときの注意
fp
=
fopen
("
aaa
.txt", "
r
");
このときファイルが
存在しないと
…
fp
=
NULL
;
オープンできなかった場合は
プログラムを終了させる
Slide101ファイル
の読み込み(
定型)
#include <
stdio.h
>
int
main(void) {
int
i
;
FILE *
fp
;
fp
=
fopen
("text.txt", "r");
if(
fp
== NULL)
return 0;
fscanf
(
fp
, "%d", &
i
);
fclose(fp); printf("%d \n", i); return 0;}追加する
Slide102scanf
のように
使える
#include <
stdio.h
>
int
main(void) {
char
st
[20];
FILE *
fp
;
fp
=
fopen
("text.txt", "r");
if(
fp
== NULL)
return 0;
fscanf
(
fp
, "%s", &
st
);
fclose(fp); printf("%s \n", st); return 0;}
Slide103スペースで読み込みが終了する
#include <
stdio.h
>
int
main(void) {
char
st
[20];
FILE *
fp
;
fp
=
fopen
("text.txt", "r");
if(
fp
== NULL)
return 0;
fscanf
(
fp
, "%s", &
st
);
fclose
(
fp); printf("%s \n", st); return 0;}テキストファイルの中身を変更して実行してみるThey are students.test.txtTheyしか表示されない
Slide1041行ずつ読み込む
#include <
stdio.h
>
int
main(void) {
char
st
[20];
FILE *
fp
;
fp
=
fopen
("text.txt", "r");
if(
fp
== NULL)
return 0;
fgets
(
st
, 19,
fp
);
fclose
(
fp); printf("%s \n", st); return 0;}They are students.test.txt1行ぶんの文字列が出力される
Slide105fgets
関数の意味
fgets
(
st
, 19,
fp
);
格納用の文字配列
読み込み最大数
ファイルポインタ
「
\0
」が最後に入る
ので
-1
になっている
「
\n
」も格納される
Slide106ファイルを最後まで読み込む
#include <
stdio.h
>
int
main(void) {
char
st
[20];
FILE *
fp
;
fp
=
fopen
("text.txt", "r");
if(
fp
== NULL)
return 0;
while(1){
fgets
(
st
, 19,
fp
);
if(
feof
(fp)) break; printf("%s", st); } fclose(fp); return 0;}abcdefghijklmnopqrstuvwxyztest.txtファイルが終端のときtrueになる
Slide107今週はここまで
何か質問はありませんか?