今回はファイルの読み込みについて質問があります。);}のようなコードを書いておりました。これだとコードがごちゃごちゃして見づらいので新たにファイル読み込みプログラムを書きたいと思いました。自分は上のようなコードしかかけないので、スマートな書き方を教えて下さい。追加で質問させてください。6年前ファイルの内容に何らかの文法があるようですね。するということになります。したがって、読込部分が複雑になるのは必然ですから、それほどシンプルなプログラムには成らないでしょう。(今のプログラムも構文解析してると思えばそれなりにすっきりしたコードだと思いますよ)もっと楽ちんにしたいなら、普及している文法を使うのです。XMLやJSONにしておけば、構文解析は既成のライブラリを使えます。返信ありがとうございます。コードをスマートにしたいだけなら1、読み込む対象のデータを構造体に纏める2、構造体のデータをバイナリファイルとしてそのまま書きだす3、データはバイナリファイルとして読み込む中身は構造体として読み込まれるので、あとは構造体を格納して使うだけというやり方がありますありがとうございます。nLoop;//ループ位置。この件には関係無いのでスルーして下さい。Hoge_t;とするのでしょうか?でしたら、もうすでにしております。#既に書いたコードのコピーです。コメント行にしろ、データ行にしろ1行の長さの最大値は決まっていますか?はい。一行は64字までです。追加で質問させてください。曲名1曲名2コメント1コメント2コメント3コメント4コメント5コメント6コメント7#次の曲のなっております。曲のパス、曲名1、2は一行で、コメントは7行となっています。空行は読み飛ばしです。その部分は実装できました。最初の4行はコメントで始まります。楽ちんにしたいなら、普及している文法を使うのです。XMLやJSONにしておけば、構文解析は既成のライブラリを使えます。今の行単位で読み込むというような単純なファイルフォーマットにした方が実装が楽だと思います。最初のプログラムだと、行の途中に#があった時の動作が気になります。コードをスマートにしたいだけなら1、読み込む対象のデータを構造体に纏める2、構造体のデータをバイナリファイルとしてそのまま書きだす3、データはバイナリファイルとして読み込む中身は構造体として読み込まれるので、あとは構造体を格納して使うだけというやり方がありますありがとうございます。nLoop;//ループ位置。この件には関係無いのでスルーして下さい。Hoge_t;とするのでしょうか?でしたら、もうすでにしております。#既に書いたコードのコピーです。2、3は簡単に言うとインタプリタのようにするのでしょうか?念のため書いておきます。提示された構造体にはポインタが含まれるため、そのままバイナリデータとしてファイルに書き出しても無効なデータになります。6年前とりあえずfgetsで1行ずつ読み込むようにし、使用していない/無駄な変数は消してみました。最初のプログラムでは、1行に128バイトちょうど書かれている場合、誤動作する可能性があります。そのようなテストケース(最大テストケース)でのテストはしていますか?もちろん1行が64バイトまでという仕様なら大丈夫です。6年前コードの書き方という事でしたら、若干スパゲッティ化してますので、これを解決するのが第一の目標でしょう。不要なカウンタが多いです。原則としてカウンタを減らすのは軽く禁じ手です。日本語でコードを書いてみるとすっきりします。1関数は、1機能だと心がけてください。読み込むファイルを関数内で、決め打ちしてますが、これは引数として渡すべき物です。プログラムを殺してしまう関数はあまり好ましくありません。戻り値を利用し、失敗時にはエラーを返すようにするべきです。正否の判断は、呼び出し元に責任を負わせた方がいいです。クラスのメンバ変数でしょうか。C言語的には、これも引数として与えた方がいいです。適当ですが、C言語的に書くと、こんな感じでしょうか。コンパイルはしてません。continue;//空行:コメント行は読み飛ばし。loadCount;//読み込んだ件数を返す。nLoop;//ループ位置。この件には関係無いのでスルーして下さい。Hoge_t;ポインタの配列のようですが、件のコードの中に、これらのメンバを動的に確保していないようですが、よいのでしょうか。前のスレッドを見てないから分かりませんが。6年前あとは、エラー処理がどのくらい必要かですね。読み込むファイルをこの処理の作者しか書かないのでしたら、エラー処理はほとんど省略でいいと思います。逆に、読み込むファイルをユーザーが(普通の状況=チート/公式でない改造ではない状況で)書くことがあるのでしたら、エラー処理をきちんと考えた方がいいと思います。fgetcで読み込み、行の最大の長さを超えた部分はメモリに保存しないという処理方法が考えられます。nLoop;//ループ位置。この件には関係無いのでスルーして下さい。Hoge_t;とするのでしょうか?でしたら、もうすでにしております。#既に書いたコードのコピーです。関数でバイナリ読み込みモードでファイルを読み込むというだけのことです。6年前スマートな書き方に関して、殆どへろりんごさんが回答しちゃいましたが、1点だけ。変数名や関数名の命名規則は統一しましょう。具体的に言えば、FileNameとその他です。統一されてないと汚く見え、スマートにはまず見えません。どのような命名規則でも良いですが、とにかく統一することは常に頭に入れておいてください。非表示エリアこの非表示エリアを表示するには、登録し、ログインする必要があります。6年前ごめんなさい、#があったときの挙動を勘違いしていました。自分のコードでは「#があった行を無視する」と解釈していましたが、もとのコードの動作は「#から改行コードまでを読み飛ばし、今の行の#の前までのデータを次の行のデータとくっつける」ですね。こっちの解釈が誤解でした。カウンタを戻しているので、次の行のデータは再びバッファの先頭から書き込まれるはずです。関数でバイナリ読み込みモードでファイルを読み込むというだけのことです。難しく考えず構造体を中身のデータごとそのまま書きだして、そのまま読み込むと考えてくださいねこれは、少々危険な気がしますね。ある構造体があったとして、この構造体のサイズは処理系依存です。一般に、構造体をそのままファイルへダンプするのはあまりよろしくありません。結局のところ何らかの形で切り分けていく必要があると思います。#どういうわけだか、ビットマップはこれを前提にしているような節がありますが。有効なデータとしてではなく、ファイル内に注釈(#から始まる文字列)を記述できるという点で、テキストとして読める事が前提になっているのでは。ところで、ファイルフォーマットの仕様に触れるなら、そもそも件のフォーマットはあまりよろしくありません。ファイル内のデータの整合性を保証する仕組みが一切備わっていませんね。以下のような記述があった場合。コード:ファイルパス。曲名1曲名2コメント1コメント2コメント3コメント4コメント5コメント6コメント7コメント8このコメント8が、無視するべき物なのか、次の曲のファイルパスなのか判断出来ません。仕様上は、次の曲のファイルパスとして扱うべきのようですが。プログラム内で、読み込んだデータの整合性を保証することが極めて困難です。フォーマットの仕様を考えなおした方がいい気がします。6年前みなさん、返信ありがとうございます。風邪を引いたみたいで昨日は返信が出来ませんでした。>>beatle様ファイルの内容に何らかの文法があるようですね。するということになります。したがって、読込部分が複雑になるのは必然ですから、それほどシンプルなプログラムには成らないでしょう。(今のプログラムも構文解析してると思えばそれなりにすっきりしたコードだと思いますよ)ありがとうございます。自分としては、もっとすっきり書けるのではないだろうか、と考えていました。読み込みと字句解析というかなんというか、同時にするのは如何なものかと考えましたが、自分の力ではどうすることもできず...もっと楽ちんにしたいなら、普及している文法を使うのです。XMLやJSONにしておけば、構文解析は既成のライブラリを使えます。自分の考えているものはそこまで複雑な文法は使わないので、必要はないかなと考え、独自のフォーマットでしたいと思いました。>>みけCAT様ただ、最初のプログラムだと、行の途中に#があった時の動作が気になります。(仕様でしょうか?)念のため書いておきます。提示された構造体にはポインタが含まれるため、そのままバイナリデータとしてファイルに書き出しても無効なデータになります。