読者です 読者をやめる 読者になる 読者になる

りーまの日記

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

独C9.4-2

独習C進捗 C言語

独習Cの進捗状況

WBCの季節です!野球見ながら情報処理試験のテストを解くわけにも行かなかったので久しぶりに独習Cの続きを写経しました

-------3月8日----------------------------------------

fprintf(FILE *ストリーム,char *制御文字列)
fscanf(FILE *ストリーム,char *制御文字列)
 fprintf()とfscanf()を使う利点は様々な形のデータをテキスト形式でファイルに書き込むことが非常に容易になる事です

 

ちょっとやったんですが

なんだかすこし違和感がありました…

こんな感じで納得したんですがちょっとづつ慣れていきます!

情報処理技術者試験の進捗

プログラム知識 資格試験 情報処理技術者試験

情報処理技術者試験の進捗です

-------3月6日----------------------------------------

2/17 平成28年度 春期 午前 1回目 37/80

2/21 平成28年度 春期 午前 2回目 68/80

2/21 平成27年度 秋期 午前 1回目 40/80

2/22 平成27年度 秋期 午前 2回目 77/80

3/2   平成27年度 春期 午前 1回目 41/80

3/3   平成27年度 春期 午前 2回目 75/80

3/4   平成26年度 秋期 午前 1回目 39/80

3/5   平成26年度 秋期 午前 2回目 75/80

3/5   平成28年度 春期 午前 3回目 75/80

3/6   平成27年度 秋期 午前 3回目 70/80

3/6   平成27年度 春期 午前 3回目 74/80

 

ちょっと2月の終わりから3月のはじめまで県外に遊びに行ってたのでそこの進捗はありません

 

年ごと

平成28年 春期 午前

1回目 37/80

2回目 68/80

3回目 75/80

平成27年 秋期 午前

1回目 40/80

2回目 77/80

3回目 70/80

平成27年 春期 午前

1回目 41/80

2回目 75/80

3回目 74/80

平成26年 秋期 午前

1回目 39/60

2回目 75/80

 

初見が弱いですね…

40/80前後…

今までの資格試験の要領で2回目は満点とれるように1回目を深く復習するというスタイルは出題範囲が膨大な試験ではあまり効果がないのでしょうか…

とりあえずもう少したくさん問題に触れてみます!

拡張子勉強の記録

プログラム知識 拡張子

-------2月20日----------------------------------------
拡張子
ファイル操作をしているうちに見たことのない拡張子にたくさん会いました

知らなかったものを調べてみました

ここでは
.rels
.xml
[Content_Types].xml

Office Open XML file formats - Wikipedia

一応一通り読みましたがピントくるものがありません…
Office専用(?)の何かって感じですかね…

いつか読み返して何かわかるときが来るように頑張ります…

 

あと特に直接関係ないのですが拡張子を調べていて気になったので

WindowsOSのローカルディスク(c:)の「windows」フォルダ

この中身の仕組みについて書いてある本があれば教えてほしいです。

 

ファイルやるまではどちらかと言えば内向きなプログラミングでしたがファイルをやると次第に外向きになっていきプログラム関数だけではなく情報用語も知っておかないと苦労する場面が出てきて今はプログラムと一緒に情報用語を少しずつ勉強してます。

時間はかかりますが遠回りしても一つずつ拾っていきたいです!

独C9.4-1

独習C進捗 C言語

独習Cの進捗状況

-------2月17日----------------------------------------

 

fclose()
 成功すると0を返し、エラーが起きるとEOFを返す

拡張子「.tmp」
 一時的なファイルを作成するときなどに使う
 特に拡張子に決まりはないが.tmpが一般的

一時的なファイルの作り方を学んだ

fputs(char *文字列,FILE *ストリーム);
 ・文字列をファイルに書き込む
 ・エラーが発生するとEOFを返し、正孔すると負でない値を返す
 ・文字列の終端にあるヌル文字は書きこまれない
 ・復帰文字が自動的に追加されることはない

fgets(char *文字列,int 数値,FILE *ストリーム);
 ・ファイルから文字列を読み込む 
 ・成功すると「文字列」を返し、エラーが発生するとヌルポインタを返す
 ・数値-1分の文字列を読み込むか、改行文字に出会うか、ファイルの終わりに達するまで続く
 ・格納された文字列の後にヌル文字が追加される
 ・改行文字も格納される

fprintf(FILE *ストリーム,char *制御文字列)
fscanf(FILE *ストリーム,char *制御文字列)
 fprintf()とfscanf()を使う利点は様々な形のデータをテキスト形式でファイルに書き込むことが非常に容易になる事です

未解決の外部シンボル_mainが 関数"int_cdecl invoke_main(void)"(? invoke_main@@YAHXZ)で参照されました

独習C進捗 プログラム知識 C言語 Visual Studio

-------2月17日----------------------------------------

今日、引き続きファイルの操作をしてました
そうするとVisual Studio(以下VS)で


LNK2019
未解決の外部シンボル_mainが
関数"int_cdecl invoke_main(void)"(?
invoke_main@@YAHXZ)で参照されました。

LNK1120
1件の未解決の外部参照

という2つのエラーが出てきました。

ファイルを取り扱っていたので「外部に何か」つまりファイル操作だと思いエラーコードを検索してみました

 

出てきた記事は

http://dixq.net/forum/viewtopic.php?f=3&t=16967


質問ツールで誰かのサイトとかではないので信頼の点で怒られそうですが
解決したようですし自分で書き込むのも信頼に欠けるので引用させてもらいました

他にもいくつか見てみた結果、要するに

---------------------------------------------------------
Win32プロジェクトでプロジェクトの作成をやらず

Win32コンソールアプリケーションでやればできました!!!!
---------------------------------------------------------

というものがほとんどでした。

自分の場合はそれをしても解決しなかったのでTwitterに聞いてみると

-----------------------------------

「main関数のスペルを間違ってました」

「mian」としていました…
-----------------------------------

ファイル関連の作業中に外部に問題があると言われてとても焦りましたが
自分のスペルミスだったんですね…


VSではprintf()とかの綴りを間違えると

C3861
'[綴りを間違えた関数]':識別子が見つかりませんでした

などとエラーが出るので安心していました…

 

ファイルの前にもっと早くこの間違いをしていればファイルが原因だと思うことはなく
すぐに問題も解決できていたんですが経験が足りなかったです。

以下教えてもらった過程

 

 

 

独習C9.3-1

独習C進捗

独習Cの進捗状況

 

とりあえずコマンドライン引数が使えるようになったのでやっと独習Cが進めます

 

-------2月16日----------------------------------------

strcmp(文字列1,文字列2)
 <string.h>
 2つの文字列を比較する
「文字列1」「文字列2」が同じ時に0を返す

putchar()
 <stdio.h>
 画面に1文字だけを出力します
 出力エラーが出た場合EOFを返す
 printf()で%c指定子を使って1文字出力するなら、実行速度と効率の点で
 putchar()を使う方が有利
 printf()は非常に多くの機能を持つ柔軟な関数ですがその分、putchar()の呼び出しに比べてオーバーヘッドが大きい


feof(FILE *ストリーム)
 ストリームに結び付けられているファイルの終わりに達していれば
 0以外の値を返し、そうでなければ0を返す

ferror(FILE *ストリーム)
 ストリームに結び付けられているファイルに関してエラーが起こっていれば
 0以外の値を返し、そうでなければ0を返す


次の関数はファイルの終わりまで読み取りエラー検査を追加したもの
 
FILE *fp;

 ・
 ・
 while(!feof(fp)){
  ch=fgetc(fp);
  if(ferror(fp)){
   printf("ファイルエラー\n");
   break;
  }
 }

補足
 本参考書はferror()は省略することがあるが実際はきちんとエラー検出をすべき

 /*ferror()ってなんかちょっと曖昧な感じがしますね*/

コマンドライン引数

プログラム知識 独習C進捗 C言語

ここ3週間ほどずっとVisual Studio(以下VS) を利用したC言語コマンドライン引数を使ったファイルの開き方が分かりませんでした…

 

ここあさんに教えてもらいました

解説してもらったブログ

https://koron0902.ddns.net/index.php/2017/02/15/cmd-arg-vs/

 

ここにやり方が書いてあります

本当にありがとうございます

 

苦戦した理由の一番大きな勘違いは

・argc,argvがそのパソコン上では全てのプログラムで同一なものと思ってた事

 

今回苦戦した理由は4つあります

1.テキストファイルの意味がわかってなかった

  テキストファイルは何かのファイルとだけ思っていた

 

2.コマンドライン引数がわかってなかった

  引数なのでどこからか別の所からやってくる、そういうイメージがありましたが

  main関数の外側が一体何なのか…

 

3.そもそもファイルの開き方がわかってなかった

  ファイルをコマンドライン引数で開くと始めにargc,argvが出てくるが

  それに謎の疑問を抱いてしまった

 

4.VSのフォルダ分けがわかっていなかった

  ソースプログラムと同じフォルダに入れる、という記述を見てやってみようと

  思ったのですがVSのprojectファイルが複雑で混乱した

 

苦戦した理由の解決策

1.テキストファイルの意味がわかってなかった

  テキストファイルとは文字データだけのファイルの事であり

  「.txt」の拡張子を持つ物

  Wordは行間の幅など「書式設定」を含んでいるので文字だけのデータでありません

 

2.コマンドライン引数がわかってなかった

  コマンドライン引数は自分で設定するものではなくコンピュータが勝手に

  作ってくれるものだと勝手に思っていたので解釈が進みませんでした…

  さらにargc,argvがそのパソコン上では全てのプログラムで同一なものと

  思ってことも原因にあります。

  ここあさんに教えてもらい自分でいくつかプログラムを実行しようとした

  ときプログラムごとにコマンドライン引数の中身のファイルが違ったので

  気づきました…

 

3.そもそもファイルの開き方がわかってなかった

  ファイルをコマンドライン引数で開くと始めにargc,argvが出てくるが

  それに謎の疑問を抱いてしまった

  ↑

  これはどうやらコマンドライン引数を使ってファイルを開いたとき

  すべてのプログラムで現れます

 

4.VSのフォルダ分けがわかっていなかった

  ソースプログラムと同じフォルダに入れる、という記述を見てやってみようと

  思ったのですがVSのprojectファイルが複雑で混乱した

  ↑

  これもあれますが

  カレントディレクトリ、パスなどの言葉を忘れていたのも原因にあります

  VSの拡張子「.vcxproj」について勉強すると少しわかります

 

/*一応なぜコマンドラインの話になったかということと失敗した経緯*/

まず始まりは僕が使っている参考書「独習C」9章はファイルの取り扱いの章でした。コマンドライン引数については7章でチラッと出てきてVSの仕様をいろいろ調べたんですがあまり見たことない形式(main関数に引数がついているプログラム)だったし検索してもピンポイントにVSの記事が見つからず放っておいた(今思うと検索ワードがまずかった)のです。

すると9章でほぼすべてのプログラムがコマンドライン引数を使用してファイルを開いていたのでVSでどうにかする方法を探していました。

まず、写経して半角英数字で書かれたテキストファイルを開いてAが何文字含まれているか数えろというと所で既にわかりませんでした。

 

テキストファイルをただ「何かのファイル」とだけ思っていてそのファイルをどこに作るのかプログラムの中なのか外なのか、外だとしたらどこに作れば良いのかパソコンの中ならどこでもよいのか

 

テキストファイルがまずなんなのかを気にする前にいろいろな疑問が出てきてかつコマンドライン引数がわからないという状況で

 

・動画の説明を見ているときになぜメモ帳を開いたのかわからない

・他の人の参考記事を見てファイルを開くプログラムを実行したときにコマンドプロンプトの初めにargv,argvが出てくるのがそういうものだと認識できずずっと悩んでいた

 

などと今思うと本当に何やってるかわからない事をしていて、

コマンドライン引数について調べるためmain関数がどのように処理されるのかやパソコンの内部、カーネルやOSやシェルの分野の話を勉強し始める

・さらに物理メモリやハードディスクとしてのCPUの内部構造を勉強し始める

 

など違う方向ですべてを理解しようとしたのでかなり遠回りなことをしてしまいました…(いろいろわかったことが増えたので結果的には良かったです)

 

まとめ

ブログの書き方がわからなかったので読みにくいかもしれません。

本当に何をやってるかわかりませんがとりあえずVSでコマンドライン引数が使えるようになりました。

いろいろ語ったようですがこれでようやくファイル操作、コマンドライン引数が使えるスタート地点に立てたのでこれから何ができるか、どこまでできるかなどを学んでいきます

いろいろ遠回りしてすこしは予習もできたのでこの3週間を無駄にはしません