• 締切済み

【C言語】テキスト読み込みの行変更

教えて下さい。 テキストファイルから読み込む際の行変更の上手いやり方が分かりません。 今回C言語、コンソールでテキストファイルから1行ずつ読み込み表示させようと思っています。 その際ランダムで得た数値を行数とし、ズらした行の一文を表示させたいです。 例)ランダムで得た値=2、表示させたい文=2行目 添付した画像だと文字数(バイト数)が固定なのでfseekの第二引数は楽なのですが、使用したいテキストファイルはバイト数がバラバラ(半角、全角ごちゃ混ぜ)なのでfseekの第二引数も文によっては変わってしまい、どのように変えていけば良いかが分かりません。 教えて下さい。

みんなの回答

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.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 ); 何行分のデータが必要なのかなどは適宜修正してください

全文を見る
すると、全ての回答が全文表示されます。
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

通常のテキストファイルに対しては、fseekで「行数指定」といったことはできません。1行のバイト数が同じだとわかっている場合に(行数×1行のバイト数)、というのは特殊な例です。 先頭から読んでいって、改行を数えるしかありません。例えば、5行目なら、4回'\n'が出てくるまで読んで、その続きから'\n'まで読む、という感じです。 いったりきたりを繰り返すなら ・毎回先頭に戻って数えなおす ・文字列の配列に全部読み込む ・各行の先頭位置をftellで読み出し、配列やリストに記録して、fseekで移動する

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • c言語 ファイルの読み込み位置

    ファイルのアクセス位置を最後から7行目に移動させるプログラムを作っています。 \nを数えることで行数を数えているのですが、以下の処理、間違えていますか? コンパイルしてもできていないので間違えていることは明白なのですが、どこが違うかわかりません。 誰か、力になってください! fseek(fp, -1, SEEK_END);/*読込位置最後にする */ while(!fseek(fp, -2, SEEK_CUR))/*逆順読込ループ*/ {   if(getc(fp)=='\n')  {cnt++;}  if(cnt == 7)  {break;} }

  • c# テキストファイル操作について

    C#でテキストファイルを読み込み、そのテキストファイルの行数を数えるようにしたいのですが・・・。 テキストファイルを読み込むことができたんですが、行を数えることができません。どなたか、教えていただけませんか?よろしくお願いします。

  • C言語でテキストファイルへのランダムアクセス

    こんにちは。 C言語を使い、CSVファイルで特定の通し番号が振られたレコード1行の値を 変数に格納したいのですがそれはできないのでしょうか? いろいろな参考書を確認するとバイナリファイルならランダムアクセスという方法で 任意の場所に直接アクセスできるらしいですが CSVなどのテキストファイルの場合、 一度ファイルの内容をすべて変数に読み込んで 変数内で検索するしかないのでしょうか? レコード数が多い場合でも変数にすべて読み込むしかないのでしょうか? ちなみにこんなファイルです。 001,山田 太郎,yamada tarou,東京,世田谷,08012341234 002,佐藤 二郎,satou jirou,北海道,釧路,09012341234 1カラム目は固定長、そのほかは可変長です。 ランダムアクセスで使うfseek関数はサイズで移動するらしいので 可変長のデータが含まれているとこの関数は使えないんじゃないかと思っています。 2カラム目には半角スペースも入っています。 1000レコードくらいです。 ご存知のかた、アドバイスお願いします。

  • ○行目から□行目だけを表示するコマンド

    テキストファイルの中から、10行目から20行目のみを表示するようなコマンドがあれば教えてください。 CATやMOREのようなコマンドにオプションで行数を指定して指定した行数だけを見ることは可能でしょうか? もしコマンドで一発で無理なら、hoge.txtというファイルの10行目から20行目までを表示するような簡単なシェルの書き方を教えてください。 よろしくお願いします。

  • テキストファイルの読み込みと書き出し

    全行数の取得はできたのですが、 テキストファイルの中で、文字を検索して、その検索文字のある行番号を取得したいのですが、 どうやったらいいですか? (accessからテキストファイルを開いて読みこんでいます)

  • テキストファイルの読み込みとファイルポインタについて質問です。

    テキストファイルの読み込みとファイルポインタについて質問です。 最近PHPを勉強し始めました。 fgets()とfseek()についてわからないことがあるので教えて頂けないでしょうか。 現状以下のテキストとPHPファイルを用意しています。 PHPに2行目のbを表示させたいのですが、思ったように表示をさせることができません。 fgets()は"現在のファイルポインタから次の1行を取得" fseek()は"ファイルポインタを指定したバイト数分移動する"と調べてわかりました。 この二つを使って2行目を指定してbを表示したいのですがうまく表示されて困っています。 test.phpのコメントの★の部分がわからない箇所になります。 おそらく根本的な考え方が間違っていると思うのですが…いろいろ調べたのですがわかりませんでした。 申し訳ありませんがご教授願えないでしょうか。 ----------------- new.txt ----------------- a b c d e ----------------- ----------------- test.php ----------------- <?PHP $new_file = 'new.txt'; $fpt = fopen($new_file,'r'); // ファイルオープン直後のポインタ位置 echo '現在の位置=行指定'.ftell($fpt).'<br>'; print fgets($fpt).'<br>'; // ポインタを5進める fseek($fpt,5); echo '現在の位置=行指定'.ftell($fpt).'<br>'; // ポインタの位置確認 print fgets($fpt).'<br>'; // ★ここでeを表示したい // 現在の位置からポインタを3戻す fseek($fpt,-3,SEEK_CUR); echo '現在の位置=行指定'.ftell($fpt).'<br>'; // ★行指定が5-3なので2に…ならないです。 print fgets($fpt).'<br>'; // ポインタを先頭へ rewind($fpt); echo '現在の位置=行指定'.ftell($fpt).'<br>'; // ポイントが先頭にきたか確認 print fgets($fpt).'<br>'; // ポインタを最後へ fseek($fpt,0,SEEK_END); echo '現在の位置=行指定'.ftell($fpt).'<br>'; // ★new.txtはabcdeの5行なので5になると思いきや18に… print fgets($fpt).'<br>'; fclose($fpt); // ファイルを閉じる ?> ----------------- ----------------- 実行結果 ----------------- 現在の位置=行指定0 a 現在の位置=行指定5 現在の位置=行指定3 b 現在の位置=行指定0 a 現在の位置=行指定18

    • ベストアンサー
    • PHP
  • C言語のテキストファイルの読込み

    必要に迫られてC言語でテキストファイルの読込みを行う プログラムを作成しなければならなくなりました。 whileとfscanfを用いて書式を指定して一行ずつ読込むことができる ということは知っていますが、その際、たとえば読み込むファイルが 20行のテキストファイルだったとして、10行目から読込みを 行いたい場合はどのようにプログラムを書けばいいのでしょうか? なにぶんC言語初心者ですのでよろしくお願いします。

  • VBでのテキストファイルの 読み込み & 書き出し について

    テキストファイルの中味を全部読み込んで、テキストボックスに表示するというコードをOpenステートメントを使って書いています。 その際、1つの種類のデータを1つのテキストファィルとして書き出し&読み込み しているのですが、これですと種類が増えていくとともにテキストファイルの 数もどんどん増えてしまい効率が悪いです。 で、それらを1つのテキストファイルにまとめておいて、中をセクションに 区切って、それを読み込み&書き出しする方法はあるのでしょうか? データが1行ですと分かるのですが、それぞれが長いテキストデータを1つの テキストファイルに区切って書き出し&読み込みする方法が分かりません。 どなたか教えてください!!!!!!! よろしくお願いします。

  • C言語の関数について困っています

    こんにちは。 C言語で、テキストファイルの行数を数える関数があれば教えて頂けないでしょうか。例えば、以下の3行を含んでいるテキストファイルを対象としたとすれば 123465789123456789 1234567981234579 987654321987654321 関数を実行すれば、3という数字が得られ、 123456  789 123546879  123 123  456789123   123456789123 というテキストファイルであれば、4という数字が得られる。そんな関数をご存知な方は私にご教授願えないでしょうか。どうぞよろしくお願いします。

  • 外部テキストの一行単位での読み込み

    flashでタイピングゲームを作成しています。 問題を外部テキストファイルから一行単位で読み込み、 それを配列に保存し、ランダムで出力するという仕様です。 外部テキストファイルの読み込み方、一行単位での配列への保存がわかりません。 外部テキストファイル名 elang.txt //////////中身////////////// FOOT HAND HEAD //////////////////////////// /////////読み込みソース////////////////// i = 0; //ループ変数 elangword = new Array(); //配列 ///////////////////////////////////////// 読み込みソースはここまでしかできていません。 問題出力ソースはできています。 外部テキストファイルの中身の変更、読み込みソースの 変更をしてもかまいませんので、どなたがご教授していただけたら幸いです。 どうかよろしく御願い致します。 補足 C言語の知識はある程度あります。 /////////開発環境///////////////// windows xp sp2 Flash Mx /////////////////////////////////