掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.29021

ファイルの読み込みについて
投稿者---lucia(2006/11/24 10:35:42)


テキストファイルを1行読み込んで、その行の最後から20文字読込んで表示するにはどのようにすればよいのでしょうか?

コンパイラはborlandです。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:ファイルの読み込みについて 29022 通りすがり 2006/11/24 10:46:04


No.29022

Re:ファイルの読み込みについて
投稿者---通りすがり(2006/11/24 10:46:04)


ご自分ではどこまでできていて、
どこから先ができないか、
詳しく教えてください。



この投稿にコメントする

削除パスワード

No.29023

Re:ファイルの読み込みについて
投稿者---lucia(2006/11/24 11:02:26)


>どこから先ができないか、
>詳しく教えてください。

1行を読込む方法とその行の最後からの読み込みの方法で詰まっています。


この投稿にコメントする

削除パスワード

No.29024

Re:ファイルの読み込みについて
投稿者---kafuka(2006/11/24 11:19:43)


>1行を読込む方法
→fgets()

>その行の最後からの読み込みの方法
X行分のバッファを用意して仮記憶しておいて最後に出力するとか。
(シークを使ってできないこともないけど)


この投稿にコメントする

削除パスワード

No.29026

Re:ファイルの読み込みについて
投稿者---kafuka(2006/11/24 11:54:42)


>>1行を読込む方法
>→fgets()
>
>>その行の最後からの読み込みの方法
>X行分のバッファを用意して仮記憶しておいて最後に出力するとか。
>(シークを使ってできないこともないけど)

最後の"20文字"でしたか。
失礼しました。"20行"と読み違えていました。

20文字分のバッファを用意。
改行または終端でない場合は文字をバッファに格納。(最後の20文字が残るよう上手く上書きしていく)
改行または終端を読込んだら、バッファを出力。

とか。


この投稿にコメントする

削除パスワード

No.29025

Re:ファイルの読み込みについて
投稿者---通りすがり(2006/11/24 11:28:27)


1行分を読むには、fgets関数を使うとよいでしょう。
例えば、
abcdef(改行)
という行をfgetsで読んだとき、
その第1引数に指定した配列(大きさは、1行分を格納するのに
十分であること)には
'a', 'b', 'c', 'd', 'e', 'f', '\n', '\0'
が入ります。

ここで、'\n'を有効な内容として扱わないこととし、
最後の3文字('d', 'e', 'f')を出力することとします。

くだんの文字列の長さは、'\n'を含めて7です。
つまり、配列の0〜6の7要素に文字を格納しています。
そこから'd', 'e', 'f'だけを出力するには、
始点:(長さ−1−3)=3
終点:(始点+3−1)=5
で求められる範囲の文字を出力します。
実際の問題では最後の20文字ですので、3のところを
20に読み替えてください。

また、1行の長さが改行を含めて21文字未満である場合に
どういう処理を行なうか(例:1行分すべて出力する)についても
考えておく必要があると思います。


この投稿にコメントする

削除パスワード

No.29027

Re:ファイルの読み込みについて
投稿者---lucia(2006/11/24 12:02:02)


>また、1行の長さが改行を含めて21文字未満である場合に
>どういう処理を行なうか(例:1行分すべて出力する)についても
>考えておく必要があると思います。

返答ありがとうございます。
内容を詳しく書くとテキストファイルを開いて"System"という文字列が見つかったらその行の終端から20文字分表示するプログラムなのですがどのような方法があるのでしょうか?



この投稿にコメントする

削除パスワード

No.29028

Re:ファイルの読み込みについて
投稿者---kafuka(2006/11/24 12:10:50)


>内容を詳しく書くとテキストファイルを開いて"System"という文字列が見つかったらその行の終端から20文字分表示するプログラムなのですがどのような方法があるのでしょうか?

文字列から文字列を検索するにはstrstr()などを使用すれば良いと思います。
20文字表示するのはこれまでのレスをご参照のこと。

なお、1行の最大文字列長が決まっている場合と決まっていない場合では難易度もやり方も異なってきます。

#できているところまでコードを載せるとより良い回答が得られるかもしれません。


この投稿にコメントする

削除パスワード

No.29030

Re:ファイルの読み込みについて
投稿者---lucia(2006/11/24 12:38:37)


>なお、1行の最大文字列長が決まっている場合と決まっていない場合では難易度もやり方も異なってきます。
>
>#できているところまでコードを載せるとより良い回答が得られるかもしれません。

ソースがいま手元に無いので載せられないのですが1行の最大文字列長の方法はどのようにするのですか?
fgetsを使うのでしょうか?


この投稿にコメントする

削除パスワード

No.29032

Re:ファイルの読み込みについて
投稿者---kafuka(2006/11/24 13:06:34)


>1行の最大文字列長の方法はどのようにするのですか?

strlen()で取得できます。


この投稿にコメントする

削除パスワード

No.29041

Re:ファイルの読み込みについて
投稿者---lucia(2006/11/24 15:16:04)


>strlen()で取得できます。

1行の最大文字列長が決まってない場合はどのように処理すればよろしいのですか?


この投稿にコメントする

削除パスワード

No.29043

Re:ファイルの読み込みについて
投稿者---気分屋(2006/11/24 16:25:33)


>1行の最大文字列長が決まってない場合はどのように処理すればよろしいのですか?
普通は1行があるバイト数以内(私なら256バイト)に収まると仮定して配列取るけれど
それすら怪しいなら、fgetcとreallocでがんばるとか?


この投稿にコメントする

削除パスワード

No.29044

Re:ファイルの読み込みについて
投稿者---kafuka(2006/11/24 17:30:14)


>1行の最大文字列長が決まってない場合はどのように処理すればよろしいのですか?

動的に領域を確保するか、または、
ファイルから文字列を読込んだ際、常に最後の20文字をバッファに保存するようにして、
改行(または終端)がきた場合に出力すれば良いでしょう。

fgets()の仕様をしっかり理解し、さらに文字列操作系の関数(strcpy,strcat等)について知らないと厳しいでしょう。


とりあえず、なんか大きな配列(256とか1024)を用意して作成してみてはいかがでしょうか?
それができたなら必要に応じて次のステップに進むとか。


この投稿にコメントする

削除パスワード

No.29047

Re:ファイルの読み込みについて
投稿者---yoh2(2006/11/25 00:48:19)


>なお、1行の最大文字列長が決まっている場合と決まっていない場合では難易度もやり方も異なってきます。

いくつか方法を挙げてみます。まずはどの方法を採用するか決めるとよいでしょう。

1. 1行の最大文字列長が決まっている場合
1-1 その長さ(+1)の文字配列を用意し、fgets()で読み込み、それに対して
"System"検索、最後の20文字書き出しを行う。

長所:
・文字列検索も、最後の20文字を取り出すのも、標準関数そのものか、少し工夫するだけで
実現できる。一番簡単。

短所:
・最大文字列長をあまり大きく取るのは現実的ではない。
・万一想定した最大文字列長を超える行があると正しく動作しない。

2. 1行の最大文字列長が決まっていない場合
2-1 1行をmalloc()、realloc()等を使って、どんな長さでもメモリが許す限り
一行を読めるようにする。それに対して"System"検索、最後の20文字書き出しを行う。

別枝で伸びている話はこの方法ですね。

長所:
・かなり長い行にも対応。
・一行読み込みさえできれば、あとは1-1の方法と同様で簡単。

短所:
・メモリを比較的大量に使う。(まずないと思うが)一行に10億文字(1GB相当)とか
書かれるとメモリが不足する可能性大。

2-2 (長い行は)行の一部分を少しづつ読み込み、限られたメモリのみを使い、
"System"検索、20文字書き出しを行う。

いろいろな方法が考えられますが、例えば、20文字格納できるバッファ(char[21])を2個
用意して、交互に20文字ずつ読みながら"System"検索。行の読み込みが終了次第、
20文字出力するといった方法が考えられます。

長所:
・メモリをあまり使わない。(方法によっては1-1よりも少なくて済む)
・どんな長さの行にも対応。

短所:
・前二者に比べてやや複雑。(例として挙げた方法では、現在二つのバッファのどちら
を使っているかの管理、バッファを跨って文字列"System"が存在する場合の対応など)


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧