- ベストアンサー
fpoenからの改行コードの扱いについて
ただいま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の扱い方が間違っているのでしょうか?解決方法がおかる方がいればよろしくおねがいします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
1文字づつ読み込むならfgetcではないでしょうか? fgetsでは一行orバッファサイズ-1のどちらか小さい方を読み込みます。 それで読み込んだものを、先頭しか'\n'かどうか見ていないため、空行のみカウントされているということはありませんか?
その他の回答 (3)
- kent_a
- ベストアンサー率18% (36/199)
他の方も書かれていますが、fgetsを使用すること自体がおかしいです。 fgetsは改行までの読み込むはずなので読み込むバッファのサイズ等にもよるでしょうがかなり怪しい 改行コードとかを標準関数的にあまり意識させてくないのであれば 高水準ではなくて低水準(openとか)を使っては?
- Tacosan
- ベストアンサー率23% (3656/15482)
本論とは直接関係ないような気もしますが (というかどんなプログラムなのかが分からないと話のしようがない), 「fgetsで1文字ずつスキャン」に違和感を覚える. 1文字ずつスキャンするならもっと単純に getc を使えばいいのに ついでにいうと最初の「このOSでは改行コードはLFつまり、"\n"が当てはめられているはず」も微妙に理解が怪しい感じがする. OS によらずテキストモードであれば改行は必ず '\n' です (OS が違う改行コードを扱っているとしてもプログラム上はこれでいい: 変換が必要ならそれは処理系がよろしくする).
- asuncion
- ベストアンサー率33% (2127/6289)
ソースコード全体を見せてください。