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

A 回答 (2件)
- 最新から表示
- 回答順に表示
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 );
何行分のデータが必要なのかなどは適宜修正してください
No.1
- 回答日時:
通常のテキストファイルに対しては、fseekで「行数指定」といったことはできません。
1行のバイト数が同じだとわかっている場合に(行数×1行のバイト数)、というのは特殊な例です。先頭から読んでいって、改行を数えるしかありません。例えば、5行目なら、4回'\n'が出てくるまで読んで、その続きから'\n'まで読む、という感じです。
いったりきたりを繰り返すなら
・毎回先頭に戻って数えなおす
・文字列の配列に全部読み込む
・各行の先頭位置をftellで読み出し、配列やリストに記録して、fseekで移動する
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# [C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について 5 2022/10/05 11:03
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:48
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
- Excel(エクセル) ExcelのIF関数について 4 2023/05/24 12:54
- C言語・C++・C# c言語の問題です 2 2023/07/21 10:51
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/07/15 16:33
- Visual Basic(VBA) 特定の文字を簡単な操作で半角スペースに変換するか削除したい 2 2022/11/01 10:35
- UNIX・Linux テキストファイルをページ番号付きでコマンドラインから印刷したい 1 2023/02/22 12:47
- HTML・CSS WEBサイトの構築。表示データとWEBデザインを分離する考え方を専門用語・業界用語では何と言うか? 8 2022/09/27 09:16
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
テキストファイルの行数を取得...
-
データ読み込みについて
-
バイナリファイルをテキストフ...
-
fgetsで2行目から文字化け
-
巨大なテキストファイル(可変...
-
続・EOF判定されない
-
ファイル内のデータを1行削除...
-
(UWSC)このような場合、解決策...
-
改行までの一文字ずつのファイ...
-
fscanfについて
-
UNIXシェルプログラム等からバ...
-
c言語 2つのファイルを行ご...
-
C++でのファイル読み書き
-
連続でファイル作成
-
int型の値をファイルに保存
-
ドラッグ&ドロップすると、今...
-
0バイトファイルの作成
-
EOF判定されない
-
C言語初心者の質問失礼します。
-
どんなプログラムを書いても指...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バイナリファイルをテキストフ...
-
テキストファイルの行数を取得...
-
ファイル内のデータを1行削除...
-
巨大なテキストファイル(可変...
-
複数テキストファイルを読み込...
-
fgetsで2行目から文字化け
-
【VB.Net】バイト型配列に読み...
-
改行までの一文字ずつのファイ...
-
C言語での改行コードの扱いにつ...
-
InternetReadFileで大きいファ...
-
C/C++ ファイル入出力操作 (長...
-
fopenで開いたファイルのサイズ...
-
fopen(書き込みモード)でファイ...
-
テキストファイルの文字列の削除
-
ファイル読み込みについて
-
C言語のローカル変数の使い方に...
-
freadとfwrite
-
EOF判定されない
-
続・EOF判定されない
-
fortranで文字列を読み込む際の...
おすすめ情報