りーまの日記

特に外向けに配信しているわけではないので読みにくいかもしれませんが参考になれば幸いです

独9.1

独習Cの進捗状況
-------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日----------------------------------------

 

配列
二次元配列の入力
  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>
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);
二つとも同じもの