dポイントプレゼントキャンペーン実施中!

教えて下さい。

テキストファイルから読み込む際の行変更の上手いやり方が分かりません。

今回C言語、コンソールでテキストファイルから1行ずつ読み込み表示させようと思っています。
その際ランダムで得た数値を行数とし、ズらした行の一文を表示させたいです。
例)ランダムで得た値=2、表示させたい文=2行目

添付した画像だと文字数(バイト数)が固定なのでfseekの第二引数は楽なのですが、使用したいテキストファイルはバイト数がバラバラ(半角、全角ごちゃ混ぜ)なのでfseekの第二引数も文によっては変わってしまい、どのように変えていけば良いかが分かりません。

教えて下さい。

「【C言語】テキスト読み込みの行変更」の質問画像

A 回答 (2件)

一度ファイル全体を fgetsで取り込みながら ftellで現在のファイルポインタの位置を int型の配列に記録しておいて


その配列を元に 乱数による行選択から fseekを使えばいいのでは …


int nOffset[32768] = {0}, n = 0, m;
char sbuf[256];
FILE fp = NULL;
if ( NULL != ( fp = fopen( "sample.txt", "rt" ) ) ) {
  n = 0;
  do {
    nOffset[n] = ftell( fp );
    n++;
  } while ( n < 32768 && NULL != fgets( sbuf, sizeof( sbuf ), fp ) );
  fclose(fp);
}

fp = fopen( "sample.txt", "rt" );
m = rand() % 32768;
// nOffsetに各行のファイル先頭からのシーク量が記憶されている
fseek( fp, nOffset[m], SEEK_SET );
fgets( sbuf, sizeof( sbuf ), fp );
printf( "%s", sbuf );
fclose( fp );

何行分のデータが必要なのかなどは適宜修正してください
    • good
    • 0

通常のテキストファイルに対しては、fseekで「行数指定」といったことはできません。

1行のバイト数が同じだとわかっている場合に(行数×1行のバイト数)、というのは特殊な例です。

先頭から読んでいって、改行を数えるしかありません。例えば、5行目なら、4回'\n'が出てくるまで読んで、その続きから'\n'まで読む、という感じです。

いったりきたりを繰り返すなら
・毎回先頭に戻って数えなおす
・文字列の配列に全部読み込む
・各行の先頭位置をftellで読み出し、配列やリストに記録して、fseekで移動する
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!