独9.1
独習Cの進捗状況
-------1月21日----------------------------------------
-------1月21日----------------------------------------
fopen
:VS仕様→fopen
↓
#define _CRT_SECURE_NO_WARNINGSでエラー非表示
必要ヘッダファイルは<stdio.h>
ファイルを開いてストリームと結びつける
開く操作によってファイルに結び付けられた構造体へポ
インタを返す
開く作業が失敗するとヌルポインタを返す
モード
編集の内容を表す(簡略自己解釈)
たくさんある。→独習C:P.246
例:
r:読み込み用にテキストファイルを開く
w:書き込み用にテキストファイルを開く
FILE型
サイズ、ファイルの現在位置、アクセスモードなど
ファイルに関する様々な情報を格納する構造体
構造体
1つの名前でアクセスすることのできる変数の集まり
NULL
<stdio.h>ではNULLというマクロがヌルポインタとして定
義されている
※ファイル操作ではポインタが深く結びついているため
ポインタを変更したり、それの指しているオブジェト
を変更すると幸せになれない
※有効なファイルが返されたかどうかは非常に重要なので戻
り値がNULLでないことを"必ず"確認してください
ファイルを開く正しい方法
例:
テキスト入力のためにmyfileという名前のファイルを開く
FILE *fp;
if*1==NULL){
printf("ファイルを開く際にエラーが発生しました\n");
exit(1);/*または自分で作成したエラーハンドラに置き換える*/
}
※ファイルの存在についてそれぞれのモードによって対応が
異なるのでチェックが必要
(ファイルが新規作成されたり、上書きされたりする)
fclose
必要ヘッダファイルは<stdio.h>
ファイルを閉じストリームをファイルから切り離す
「ストリーム」はfopen()で取得した有効なファイルでなけ
ればならない
成功すると0を返し、エラーが起きるとEOFを返す
バッファをフラッシュ
ファイルシステムの実装の多くは効率を上げるためにデ
ィスクへのデータの書き込みを1セクタずつ行う。その
ため出力されたデータは、まずバッファに蓄えられ、1
セクタ分のデータが溜まったところでバッファからディ
スクに物理的に書き込まれます。一般にこれを「バッフ
ァをフラッシュする」と言います。
注意:fclose()
fclose()には決して無効な引数を渡してはなりません。
無効な引数を渡すと、ファイルシステムが損傷を受け、
場合によってはデータを失って復旧できなくなることも
あります。
*1:fp=fopen("myfile","r"
独C8.0(8章の理解度チェック)
独習Cの進捗状況
-------1月18日----------------------------------------
-------1月18日----------------------------------------
配列
二次元配列の入力
int main(void) {
int i
char str[9][40];
for (i = 0; i < 9; i++) {
printf("名前を入力してください %d:",i+1);
scanf("%s", &str[i]);
}
・1次元の方だけを書けばよい
大小の比較
if (max < num[i]) {
max = num[i];
h = i;
}
if (str2[i] < min) {
min = num[i];
l = i;
}
・比較後の最大値・最小値の入れ替えを忘れない
switch文
switch(i){
case 1:
文1;
文2;
break;
case 2:
文1;
文2;
break;
default:
文1;
文2;
break;
}
二つの文字列の比較
strcmp(文字列1,文字列2);
<string.h>が必要
一致すると0を返す
scanf
%sを使うのが賢明でないのは最初のホワイトスペースで
文字列の読み込みが止まるため
素数判定の関数模範例
int prime(int i) {
int j;
for (j = 2; j <(i/2) ; j++) {
if (!(i%j)) {
return 0;
}
}
return 1;
}
独C8.5・8.6
独習Cの進捗状況
-------1月16日----------------------------------------
プログラムのサイズを測定する?(コンパイラでの確認?)
%[最小フィールド][.][精度]フォーマット指定子
%15.2f→少数も含めた15桁、小数部2桁で表示
printf
フォーマット指定子の確認
16進数はアルファベットを含む
アルファベット小文字出力→%x
アルファベット大文字出力→%X
%n:文字数を出力 ちょっと特殊 VSでは弾かれるので補佐関数必要
#include<stdlib.h>
rand():乱数の生成
(確かに乱数だが何回実行しても同じ所に同じ数?)
scanf
フォーマット指定子の確認
%sは空白までしか読み取らない
スキャン集合%[]
aからzを表すスキャン集合 %[a-z]
scanf("%d_%c%d")→4_+5と入力できる
scanf("%3d%d"i,j)→12345と入力→i=123,j=45
%x→16進数
%d→10進数
%o→8進数
getchar()→<stdio.h>
キーボードから入力された文字を1文字だけ返す
getche()→<conio.h>
画面にエコーする
getch()→<conio.h>
画面にエコーしない
printf
%e:小文字の指数 例1.15e-9
%E:大文字の指数 例1.15E-9
スキャン集合:%[ ]
キーボードからの入力の際スキャン集合に含まれる文字を
見つけると読み込みを始め、スキャン集合にない文字が入
されると読み込みを終了する
printfとputs
puts関数の方がサイズが小さく実行速度が速い
EOF
入力・出力エラーが発生したときに返される値
独C8.3・8.4
独習Cの進捗状況
-------1月14日----------------------------------------
#include<conio.h>
-------1月14日----------------------------------------
#include<conio.h>
getch→_getch
cprinf→_cprintf
kbhit→_kbhit
アスキーコード
A:65
a:97
gets():Enterを押すまでキーボードからの文字を読みとる
そして読み取った物をstr配列に格納
改行はヌル文字に変換される
入力操作が成功すると先頭へのポインタを返し
入力操作に失敗するとヌルポインタを返す
puts():strが示している文字列を画面に出力する
(文字列の出力にprintfではなくputsが使われる主な理由は
puts関数の方がサイズが小さく実行速度が速いから)
↓
printfの完全上位互換としてputsを覚えます
gets→gets_s
p = gets_s(str);
printf("%s %s", p, str);
二つとも同じもの