• ベストアンサー
  • すぐに回答を!

fpoenからの改行コードの扱いについて

  • 質問No.5433956
  • 閲覧数82
  • ありがとう数2
  • 気になる数0
  • 回答数4
  • コメント数0

お礼率 7% (11/151)

ただいまMacOSX(10以降)でプログラミングをしています。このOSでは改行コードはLFつまり、"\n"が当てはめられているはずです。(でいいんでしょ??)

///// abc.txt(改行や空白もそのまま)//////
abc
def

ghi
/////////////////////////////////////

このテキストをfopenで開き、fgetsで1文字ずつスキャンしていて"\n"にぶちあたるとある変数をインクリメントし、最後にその行数を出すというプログラムを書いてます。

この場合改行"\n"は3回あるので最終的に3+1、つまりこのテキストは4行あるということを表示できるはずなのですが、なぜか改行が1回としか認識されず結果2行のテキストとして出力されてしまいます。

いろいろ試した結果、どうやら"\n"を判断できている場所はその次が空白の行の場合だけなのです。つまり、コンピュータ的には

///// abc.txt(改行や空白もそのまま)//////
abc\n ←ここは次にdefという文字列がきているので\nが認識されていない
def\n ←ここしか認識されていない
  \n ←同様に次の文字列がくるので認識されていない
ghi
/////////////////////////////////////

としか認識されていないようなのです。
なぜ\nの続きが文字列であると

なぜこのようなことになるのでしょうか?
\nの扱い方が間違っているのでしょうか?解決方法がおかる方がいればよろしくおねがいします。

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

  • 回答No.2
  • ベストアンサー

ベストアンサー率 75% (104/138)

1文字づつ読み込むならfgetcではないでしょうか?

fgetsでは一行orバッファサイズ-1のどちらか小さい方を読み込みます。
それで読み込んだものを、先頭しか'\n'かどうか見ていないため、空行のみカウントされているということはありませんか?

その他の回答 (全3件)

  • 回答No.4

ベストアンサー率 18% (36/199)

他の方も書かれていますが、fgetsを使用すること自体がおかしいです。
fgetsは改行までの読み込むはずなので読み込むバッファのサイズ等にもよるでしょうがかなり怪しい

改行コードとかを標準関数的にあまり意識させてくないのであれば
高水準ではなくて低水準(openとか)を使っては?
  • 回答No.3

ベストアンサー率 23% (3656/15482)

本論とは直接関係ないような気もしますが (というかどんなプログラムなのかが分からないと話のしようがない), 「fgetsで1文字ずつスキャン」に違和感を覚える. 1文字ずつスキャンするならもっと単純に getc を使えばいいのに
ついでにいうと最初の「このOSでは改行コードはLFつまり、"\n"が当てはめられているはず」も微妙に理解が怪しい感じがする. OS によらずテキストモードであれば改行は必ず '\n' です (OS が違う改行コードを扱っているとしてもプログラム上はこれでいい: 変換が必要ならそれは処理系がよろしくする).
  • 回答No.1

ベストアンサー率 31% (1608/5065)

ソースコード全体を見せてください。
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,600万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ