質問: c言語 ファイルの指定された行を表示 こんにちは。 回答お願いします。 今私は作業の高効率化を目指すためプログラムを考えています。 まだぜんぜんできていませんが・・ ファイルの指定された行を表示する関数がないだろうか? もしくは似たような方法はないだろうかと考えています。 できれば例題とともに教えていただければ幸いです。 具体的にどういう風にしたいのかというと ----test.txt------- aaaa bbbbb cccccc dddd eeeeeeee ffffff ------------------- というファイルがあったとしたらgetsで4と入れてやったら 四行目のddddが表示されるようにしたいのです。 まだまだ初心者ですのでさっと考えることができません。 どうかご教授お願いします。
回答: ★高効率を目指しているの? ・固定長データなら高効率で1行を取得できたりします。 例えば ----test.txt------- aaaaa bbbbb ccccc ddddd eeeee fffff ------------------- という固定長データ(5文字×6行)の場合は int no = 4; ←4行目を取得したい時 fseek( fp, ((no - 1) * 7), seek_set ); ←5文字+\r+\n=『7』 fgets( buff, sizeof(buff), fp ); ↑ これなら行番号で指定した1行を fgets() 関数で取得可能です。 ※なおバイナリモードでオープンして下さい。 ・可変長データの場合は行の先頭のオフセット位置を最初の読み込みで管理します。 例えば ----test.txt------- aaaa bbbbb cccccc dddd eeeeeeee ffffff ------------------- という可変長データ(4,5,6,4,8,6文字)の場合は オフセット位置の配列を行数分用意します。→事前に分かれば楽ですね。行数。 long offset[ 100 ]; ←100行だと仮定 int max; for ( max = 0 ; !feof(fp) ; max++ ){ if ( max >= 100 ){ ←安全対策 break; } offset[ max ] = ftell( fp ); fgets( buff, sizeof(buff), fp ); } ↑ ここまでがオフセット位置の読み込みです。次は読み出しです。 int no = 4; ←4行目を取得したい時 fseek( fp, offset[no - 1], seek_set ); fgets( buff, sizeof(buff), fp ); ↑ これで行番号で指定した1行を fgets() 関数で取得可能です。 ※やっぱりバイナリモードでオープンして下さい。 ・あと行数の指定時に 1~max の範囲になるように補正処理も入れたほうが良いかも。 例えば if ( no < 1 ){ no = 1; } else if ( no >= max ){ no = max; } ↑ こんな感じで。 ・以上を参考にして下さい。 下の『参考url』もどうぞ。 参考url:http://www9.plala.or.jp/sgwr-t/lib/fseek.html