アプリ版:「スタンプのみでお礼する」機能のリリースについて

以下のようなファイルを読み込みたいのですが….

--------------------------------------------------
あいうえを

かきくけこ

さしすせそ

たちつてと
--------------------------------------------------

のように1行文字列があって,1行空白行(改行のみ)があって…のような繰り返しのファイルなんですが,空白行を読み飛ばして続けて

--------------------------------------------------
あいうえお
かきくけこ
さしすせそ
たちつてと
--------------------------------------------------

のように表示させる場合はどのように書いたらよいですか?

--------------------------------------------------
while(fgets(str,256,fpin)){
  if(strcmp(str,"\n")!=0){
   printf("%s\n",str);
  }
}
--------------------------------------------------

と書いたのですが,空白行も表示されてしまいます.

何か間違えているでしょうか?
それとも実はファイルの空白行は改行じゃないとかでしょうか?

A 回答 (7件)

★『fgets』関数は1行の文字列を取得します。


・でも、この1行は改行コード(\n)まで含めた文字列を取得するのです。
・つまり、『fgets(str,256,fpin)』の1行で既に改行コードを『str』の
 バッファに読み取っています。
・そうなると、printf関数の書式制御文字列『"%s\n"』では、2重に改行
 コード(\n)が出力されてしまうのです。
・よって、書式制御文字列『"%s"』だけで良い。

●質問者さんはバイナリモードでオープンしていませんか?
・次のサンプルを試してみて下さい。

void main( void )
{
 char buff[ 256 ];
 char *seek;
 FILE *fpin;
 
 if ( (fpin = fopen("Filename.txt","rb")) != NULL ){
  while ( fgets(buff,256,fpin) != NULL ){
   for ( seek = buff ; *seek != '\0' ; seek++ ){
    if ( !isspace(*seek) ){ ←空白文字以外ならば抜ける
     break;
    }
   }
   if ( *seek != '\0' ){
    printf( "%s", buff ); ←ここがポイント
   }
  }
  fclose( fpin );
 }
}

最後に:
・『fopen』の『"rb"』バイナリ・モードは『"r"』テキスト・モードでも良い。
・上記のサンプルは、テキスト&バイナリの両モードで正しく処理されます。
・『isspace』関数は、空白、タブ、\r、\n などの空白文字を判定します。
・また、各 OS で改行コードの表現が違います。
・『Windows』では『\r\n』の2バイトで表現。
・『Mac OS』では『\r』の1バイトで表現。
・『Unix系』では『\n』の1バイトで表現。
・上記のサンプルでは、どの OS でも正常に動作するはずです。→私は未確認。
・以上。おわり。→結果報告をお願いします。
    • good
    • 1

ANo.5 です。


strtokの使い方が悪かったので訂正しておきます。

while(fgets(str,256,fpin)){
  if (strtok(str, "\x0d\x0a") != NULL){
   printf("%s\n",str);
  }
}
    • good
    • 0

VC++2005 Express Editionで実際に試してみました。


改行コードが0x0aでも0x0d0x0aでも関係なく正常に出力されましたよ。
ソースはprintf文から \n を取っただけです。

while(fgets(str,256,fpin)){
  if(strcmp(str,"\n")!=0){
   printf("%s",str);// \n 取りました
  }
}

> それとも実はファイルの空白行は改行じゃないとかでしょうか?
バイナリエディタで確認してみましょう。

処理系、OSによって改行コードの解釈とか違ったりするので、いっそのこと改行コードを削除してみてはどうでしょう?

while(fgets(str,256,fpin)){
  strtok(str, "\x0d\x0a");
  if(strcmp(str,"")!=0){
   printf("%s\n",str);
  }
}
    • good
    • 0

回答1の方と被るのですが、LinuxなどのOS上でWindowsで作られた改行つきファイルを読み込む、となると改行コードの違いが出てきます。

(VC(Windows)で同様のコードの実行ファイルを作成し、Windows上で作成したテキストファイルを使って実験したところ、うまくいきましたので…)
その場合の判定は
if(strcmp(str, "\r\n") != 0){
ではないかと思います。
はずれていたらすみません。
    • good
    • 1

printf("%s\n",str);部分で改行(\n)はいりません。


すでにstrは改行を含めて読み取っています。

この回答への補足

No.2と同様の補足ですが...
すみません,間違いです.
\nは書いてありません.
それでも空白行が出てしまいます.

補足日時:2007/01/11 19:09
    • good
    • 0

その空白行は元のファイルのものではなく


 printf("%s\n",str);
の\nによるものではないですか?
fgetsで読み込んでいるのでstrにはすでに\nが含まれていますよ。

この回答への補足

すみません,間違いです.
\nは書いてありません.
それでも空白行が出てしまいます.

補足日時:2007/01/11 19:07
    • good
    • 0

UNIXの場合の改行コードは 0x0a ですが、Windowsの場合は 0x0d0a です。


なので改行コードの判断部分を変更してください。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A