• ベストアンサー

ファイル入力したデータの行数の数え方は?

ファイル入力した漢字データ(全角)を読み込み、行数を数えながら逆から表示するプログラムはどうかいたらいいのですか? 実行結果例 (例として、次のようなA:_TEST.DAT を入力する) 「上を向いて、歩こう。涙がこぼ  れないように。泣きながら、歩  く一人ぼっちの夜。」 ファイル名を入力して下さい:A:_TEST.DAT ↓ 1: ぼこが涙。うこ歩、てい向を上 2: 歩、らがなき泣。にうよいなれ 3: 。夜のちっぼ人一く

質問者が選んだベストアンサー

  • ベストアンサー
  • arthur
  • ベストアンサー率34% (15/43)
回答No.3

なんだか課題っぽい感じがするのですが・・・面白そうなので考えてみました。 データの文字は全角文字のみと考えてよろしいでしょうか? ファイルをオープンし、1行ずつ読み込んで配列に格納し、配列の後ろから表示していくという考え方で作ってみました。 しかし全角文字(2バイト文字)なので、そのまま逆から表示しただけでは、まったく違う文字が表示されてしまうので、 1バイト目と2バイト目を入れ替える必要があります。 例)「あ」という文字を配列に格納すると・・・ 配列の0番目:0x82 配列の1番目:0xA0 というふうに格納されます。 しかし、配列の後ろから表示した時に「あ」と表示されるには 配列の0番目:0xA0 配列の1番目:0x82 と格納されていなければならないので、その処理を入れなければなりません。 データがすべて2バイト文字ならば、配列の要素が偶数の時に1バイト目、奇数の時に2バイト目が必ずくるので、 1バイト目ならば、+1した場所に(上の例で言えば、配列の1番目)、 2バイト目ならば、-1した場所に(上の例で言えば、配列の0番目)入替えやればいいわけです。(わかりにくいかな?^^;) その処理を行の終わり(改行文字の手前)まで繰り返して、printf文で配列の後ろから1文字ずつ表示していけば「あいうえお」が「おえういあ」と逆に表示されます。 1行終わったら、また1行読み込んでこの処理をファイルの終わり(EOF)まで繰り返せば、 希望どおりの結果になると思います。 ・・・とまぁ、とりあえず考え方だけをアドバイスしたのでわかりにくい文章かもしれませんが、これをもとに自分の力で完成させてみてくださいね^^ 不明な点があれば補足してください。 本当は専門家のarthurでした(自信ないから経験者・・(爆))

その他の回答 (4)

  • y_oku
  • ベストアンサー率62% (25/40)
回答No.5

もし課題や大きなアプリケーションの一部などではないのならば、 Perlを使ったほうが早いと思います~。 DOSプロンプトから、 perl -e "print map{ ++$i; \"$i: $_\" } reverse <>;" TEST.DAT だけでいいですよ。

  • selenity
  • ベストアンサー率41% (324/772)
回答No.4

あうっ、逆から表示を見落としていました、、、 まず、1-byte文字ずつ読んでShift-JISの日本語の 1バイト目に相当する文字であったらもう1文字 読んで、これが日本語の2バイト目に相当する文字 であればこの2バイトはこのままの順番で、この後に 今までの文字列を追加します。 Shift-JISコードの日本語は1Byte目にくるcharactor、 2Byte目にくるcharactorの範囲が決まっていますので、 このあたりで日本語か半角英数字かどうかを 比較しましょう。 または、日本語2Byteを1文字として文字単位で扱える 関数があるかもしれません。探してみましょう。 日本語Basic系(VBAなど)は結構装備してますよ。

  • haporun
  • ベストアンサー率40% (230/562)
回答No.2

あなたがどこからどの辺までわかっているのか知りたいです。 さすがにこれに全部答えるのには気が知れます。 どこかの学校の問題っぽいです。 TurboCを使っているということはDOS上ですよね。 DOSでは日本語にShift-JISという文字コートが使われており、そのコードの文字列を逆から操作するのは、非常に難しいことです。 日本語コードの部分をひっくり返さないようにしなければならないのですが、Shift-JISではどこが日本語なのかを区別するのが非常に困難です。 >~漢字データ(全角)を読み込み~ もし本当に、全角文字しか読み込まないのなら、forで1バイト走査して改行コードが見つかったら、後ろから2バイトずつ戻って別の配列に書き込んでいけば良いでしょう。

noname#1519
質問者

補足

ファイルのオープンや行数をつけて表示することはわかります。漢字は2バイトということなので逆からの表示のしかたでつまっています

  • selenity
  • ベストアンサー率41% (324/772)
回答No.1

fgetsを使って行単位で読み込んでもいいですし、 fgetcで1文字ずつ読み込み、0x0aが来たら行末と 見なと良いでしょう。

関連するQ&A