プログラミング論
ファイル入出力
http://www.ns.kogakuin.ac.jp/~ct13140/ProgC/
概要
•
動的変数と静的変数の初期値–
簡単•
実引数と仮引数,値渡しと参照渡し–
本当はものすごく難しいが,本日は簡単.–
詳細は プログラミング3 の ポインタ にて•
ファイル処理–
難しくないが,面倒? 慣れが必要D-2
動的変数と静的変数の初期値
void main() { int x, y, z;
printf("%d\n", x);
printf("%d\n", y);
printf("%d\n", z);
} 実行結果 32767 0 0
↑ゴミが入っている (gcc & Linuxで実行)
int x, y, z;
void main() { printf("%d\n", x);
printf("%d\n", y);
printf("%d\n", z);
} 実行結果 0 0 0
↑0クリアされている
グローバル変数,静的(static)変数は,自動的に0で初期化される.
staticでないローカル変数は,初期化されずゴミが入っている.
D-3
動的変数と静的変数の初期値
void main() { int x, y, z;
printf("%d\n", x);
printf("%d\n", y);
printf("%d\n", z);
}
Uninitialized variable 'x' used
初期化されていないローカル変数xが使用されています
↑実行できな
(Visual Studio 2015で実行)
グローバル変数,静的(static)変数は,自動的に0で初期化される.
staticでないローカル変数は,初期化されずゴミが入っている.
D-4
動的変数と静的変数の初期値
void main() { int x[3];
printf("%d\n", x[0]);
printf("%d\n", x[1]);
printf("%d\n", x[2]);
} 実行結果 -858993460 -858993460 -858993460
↑ゴミが入っている
Visual Studioでも実行可能
void main() {
static int x[3];
printf("%d\n", x[0]);
printf("%d\n", x[1]);
printf("%d\n", x[2]);
} 実行結果 0 0 0
↑0クリアされている
グローバル変数,静的(static)変数は,自動的に0で初期化される.
staticでないローカル変数は,初期化されずゴミが入っている.
D-5
実引数 と 仮引数 値渡し と 参照渡し
関数の仮引数と実引数
(
値渡し)
void func(int a){
a = 7;
}
void main(){
int x = 3;
func(x);
printf("%d\n", x);
}
100 番地
3 x
D-7
void func(int a){
a = 7;
}
void main(){
int x = 3;
func(x);
printf("%d\n", x);
}
100 番地
3 x
関数の仮引数と実引数
(
値渡し)
D-8
関数の仮引数と実引数(値渡し)
void func(int a){
a = 7;
}
void main(){
int x = 3;
func(x);
printf("%d\n", x);
}
100 番地
3 x
104 番地
3 a
別のメモリに割り当てられた 別の変数
D-9
関数の仮引数と実引数(値渡し)
void func(int a){
a = 7;
}
void main(){
int x = 3;
func(x);
printf("%d\n", x);
}
100 番地
3 x
104 番地
7 a
別のメモリに割り当てられた 別の変数
D-10
関数の仮引数と実引数
(
値渡し)
void func(int a){
a = 7;
}
void main(){
int x = 3;
func(x);
printf("%d\n", x);
}
3
実行結果100 番地
3 x
D-11
関数の仮引数と実引数
(
値渡し)
void func(int x){
x = 7;
}
void main(){
int x = 3;
func(x);
printf("%d\n", x);
}
3
実行結果この2個を 同じ名前にしても 結果は変わらない.
100 番地
3 x
104 番地
3 x
別のメモリに割り当てられた 別の変数
D-12
関数の仮引数と実引数
(
参照渡し)
void func(int a[2]){
a[0]=3;
}
void main(){
int x[2];
x[0]=10; x[1]=20;
func(x);
printf("%d %d\n", x[0], x[1]);
}
100 番地
10 X[]
104 番地
20 X[1]
X[0]
D-13
関数の仮引数と実引数
(
参照渡し)
void func(int a[2]){
a[0]=3;
}
void main(){
int x[2];
x[0]=10; x[1]=20;
func(x);
printf("%d %d\n", x[0], x[1]);
}
100 番地
10 X[]
104 番地
20 X[1]
X[0]
D-14
関数の仮引数と実引数
(
参照渡し)
void func(int a[2]){
a[0]=3;
}
void main(){
int x[2];
x[0]=10; x[1]=20;
func(x);
printf("%d %d\n", x[0], x[1]);
}
100 番地
10 X[]
104 番地
20 X[1]
X[0]
a[]
a[1]
a[0]
D-15
関数の仮引数と実引数
(
参照渡し)
void func(int a[2]){
a[0]=3;
}
void main(){
int x[2];
x[0]=10; x[1]=20;
func(x);
printf("%d %d\n", x[0], x[1]);
}
100 番地
3 X[]
104 番地
20 X[1]
X[0]
a[]
a[1]
a[0]
D-16
関数の仮引数と実引数(参照渡し)
void func(int a[2]){
a[0]=3;
}
void main(){
int x[2];
x[0]=10; x[1]=20;
func(x);
printf("%d %d\n", x[0], x[1]);
}
100 番地
3 X[]
104 番地
20 X[0] X[1]
3 20
実行結果D-17
ファイル処理
(
入門編)
ファイルを開く
(a)
fopen("ファイル名", "モード");
戻り値: 成功したらファイルへのポインタ,
失敗したら
NULL.
使用例
FILE *fp;
fp = fopen("s:\\a.txt", "rt");
if( fp == NULL ){
perror("ファイルを開けません.");
}
D-19
ファイル処理例
0a
#include <stdio.h> // fopenやNULLなどに必要
#include <stdlib.h> // exit()に必要
int main() {
FILE *fp;
fp = fopen("S:\\a.txt", "wt");
if ( fp == NULL ) {
perror("ファイルを開けません");
exit(1);
}
fprintf( fp, "Hello, World!\n");
fclose(fp);
return 0;
}
ファイルポインタ変数 fpを宣言.
FILE *型のfpという名の変数
fopenでファイルを開く.
以後,変数fpが そのファイルを象徴
fcloseで ファイルを閉じる.
fpが象徴する ファイルにprintf
Open成功なら 非NULL.
失敗ならNULL
D-20
ファイルを開く
(b)
fopen_s(&fp, "ファイル名", "モード");
戻り値: 成功したら0. 失敗したら0以外.
使用例
FILE *fp;
int ret;
ret = fopen_s(&fp, "s:\\a.txt", "rt");
if( ret != 0 ){
perror("ファイルを開けません.");
}
D-21
ファイル処理例
0b
#include "stdafx.h"
#include <stdlib.h> // exit()に必要
int main() {
FILE *fp;
int ret;
ret = fopen_s( &fp, "S:\\a.txt", "wt");
if ( ret != 0 ) {
perror("ファイルを開けません");
exit(1);
}
fprintf(fp, "Hello, World!\n");
fclose(fp);
return 0;
}
D-22
fgetc (1/2)
• int fgetc(FILE *fp);
ファイル
fp
から1
文字読み込む.戻り値:
正常時 読み込んだ文字の文字コード 失敗時
-1
例えば,ファイルの終端に至り これ以上読み込め ない状況で
fgetc
を行うと,失敗となる.D-23
fgetc (2/2)
int ret;
ret = fgetc( fp );
if( ret == -1 ){
perror("ファイル読み込み失敗.");
exit(1);
} else {
printf("文字=%c ",ret);
printf("文字コード=%d\n", ret);
}
D-24
ファイル処理例
1
#include "stdafx.h"
#include <stdlib.h>
int main() {
int ret, ch;
FILE *fp;
ret = fopen_s(&fp, "S:\\a.txt", "rt");
if( ret != 0) {
perror("ファイルを開けません");
exit(1);
}
while( (ch = fgetc(fp)) != -1 ){
printf("(%c,%d)\n", ch, ch);
}
fclose(fp);
return 0;
}
D-25
ファイル処理例
1
実行結果 (H,72) (e,101) (l,108) (l,108) (o,111) (,,44) ( ,10) (W,87) (o,111) (r,114) (l,108) (d,100) (!,33)
"S:\a.txt"
Hello, World!
D-26
ファイル処理例
2
#include "stdafx.h"
#include <stdlib.h>
int main(){
int ret, ch, cnt = 0;
FILE *fp;
ret = fopen_s(&fp, "S:\\a.txt", "rt");
if (ret != 0) {
perror("ファイルを開けません");
exit(1);
}
while( (ch = fgetc(fp)) != -1 ) { if( ch == 'o' ){ //文字aの文字コードは'a'
cnt++;
} }
fclose(fp);
printf("o は %d個ありました.\n", cnt);
return 0;
}
D-27
ファイル処理例
2
実行結果
o は 2個ありました.
"S:\a.txt"
Hello, World!
D-28
良くある短縮表記
fp = fopen("S:\\a.txt", "wt");
if( fp == NULL ){
↓
if( (fp=fopen("S:\\a.txt","wt")) == NULL ) {
ret = fopen_s(&fp, "S:\\a.txt", "rt");
if( ret != 0){
↓
if( (fopen_s(&fp,"S:\\a.txt","rt")) != 0 ){
D-29