みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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の扱い方が間違っているのでしょうか?解決方法がおかる方がいればよろしくおねがいします。

投稿日時 - 2009-11-09 14:52:45

QNo.5433956

すぐに回答ほしいです

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

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

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

投稿日時 - 2009-11-09 15:12:04

ANo.2

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

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

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

投稿日時 - 2009-11-09 15:21:24

ANo.3

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

投稿日時 - 2009-11-09 15:13:09

ANo.1

ソースコード全体を見せてください。

投稿日時 - 2009-11-09 14:59:56

あなたにオススメの質問