• 締切済み

改行を読み飛ばす

以下のようなファイルを読み込みたいのですが…. -------------------------------------------------- あいうえを かきくけこ さしすせそ たちつてと -------------------------------------------------- のように1行文字列があって,1行空白行(改行のみ)があって…のような繰り返しのファイルなんですが,空白行を読み飛ばして続けて -------------------------------------------------- あいうえお かきくけこ さしすせそ たちつてと -------------------------------------------------- のように表示させる場合はどのように書いたらよいですか? -------------------------------------------------- while(fgets(str,256,fpin)){   if(strcmp(str,"\n")!=0){    printf("%s\n",str);   } } -------------------------------------------------- と書いたのですが,空白行も表示されてしまいます. 何か間違えているでしょうか? それとも実はファイルの空白行は改行じゃないとかでしょうか?

みんなの回答

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.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 でも正常に動作するはずです。→私は未確認。 ・以上。おわり。→結果報告をお願いします。

  • yonfa
  • ベストアンサー率52% (22/42)
回答No.6

ANo.5 です。 strtokの使い方が悪かったので訂正しておきます。 while(fgets(str,256,fpin)){   if (strtok(str, "\x0d\x0a") != NULL){    printf("%s\n",str);   } }

  • yonfa
  • ベストアンサー率52% (22/42)
回答No.5

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);   } }

  • shibamu
  • ベストアンサー率50% (10/20)
回答No.4

回答1の方と被るのですが、LinuxなどのOS上でWindowsで作られた改行つきファイルを読み込む、となると改行コードの違いが出てきます。(VC(Windows)で同様のコードの実行ファイルを作成し、Windows上で作成したテキストファイルを使って実験したところ、うまくいきましたので…) その場合の判定は if(strcmp(str, "\r\n") != 0){ ではないかと思います。 はずれていたらすみません。

  • IPPO_san
  • ベストアンサー率0% (0/0)
回答No.3

printf("%s\n",str);部分で改行(\n)はいりません。 すでにstrは改行を含めて読み取っています。

pepepepepe
質問者

補足

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

  • Werner
  • ベストアンサー率53% (395/735)
回答No.2

その空白行は元のファイルのものではなく  printf("%s\n",str); の\nによるものではないですか? fgetsで読み込んでいるのでstrにはすでに\nが含まれていますよ。

pepepepepe
質問者

補足

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

  • baber
  • ベストアンサー率18% (17/92)
回答No.1

UNIXの場合の改行コードは 0x0a ですが、Windowsの場合は 0x0d0a です。 なので改行コードの判断部分を変更してください。

関連するQ&A

  • C言語、ファイル操作、fgets()について

    次のプログラムは入力された行を読み込み、コマンドラインで指定されたファイルに書き込みます。 空白行が入力されたら、入力の終了とみなしてファイルを閉じます。続いてファイルを入力用に開き、 fgets()を使ってファイルの内容を表示するものです。 (ソースコードが長くてすみません) #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { FILE *fp; char str[80]; /* コマンドライン引数を検査する */ if(argc!=2) { printf("ファイル名を指定してください\n"); exit(1); } /* 出力用にファイルを開く */ if((fp = fopen(argv[1], "w"))==NULL) { printf("ファイルを開くことができません\n"); exit(1); } printf("終了するには空白行を入力してください\n"); do { printf(": "); gets(str); strcat(str, "\n"); /* 改行を追加する */ if(*str != '\n') fputs(str, fp); } while(*str != '\n'); fclose(fp); /* 入力用にファイルを開く */ if((fp = fopen(argv[1], "r"))==NULL) { printf("ファイルを開くことができません\n"); exit(1); } /* ファイルを読み込み直す */ do { fgets(str, 79, fp); if(!feof(fp)) printf(str); } while(!feof(fp)); fclose(fp); return 0; } 【質問】fgets()内のint型の数値「79」がどうして79なのかが分かりません。     80でも良いような気がするのですが・・・

  • fgetsの改行について

    fgetsで指定したファイル名のファイルを操作するプログラムの条件で、 ファイル名が入力されていない状態でエンターを入力した場合「ファイル名が未入力です」と出力してプログラムを終了させたいのですが、なぜか1行空行を挟んだ後に上記メッセージが出力されてしまいます(下記プログラム)空行を無くすにはどうすれば良いのでしょうか? これはfgetsに"\n"が含まれていることが問題なんでしょうか? if (!strcmp(filename, "\n")) { printf("ファイル名が未入力です。\n"); exit(1); }

  • Excelのセル内改行について

    Excelのセル内に改行を含むデータが入力されています。 Excelでコピー&ペーストを行えば問題ないのですが、 メモ帳にペーストすると改行が ↑ と表示されてしまい、 1行になってしまいます。 メモ帳にペーストしてもセル内で改行されているように 改行したままで貼り付けを行うことは可能でしょうか? Sheet1:A1 あいうえおかきくけこ さしすせそ たちつてとなにぬねのはひふへほ メモ帳:貼り付け あいうえおかきくけこ↑さしすせそ↑たちつてとなにぬねのはひふへほ

  • C言語の文字列の長さを計算し表示する方法について。

    #include <stdio.h> main( void ) { int i; char str[128]; printf("一行の英文を入力してください → "); scanf("%s",str); i = 0; while (str[i] != '\0'){ i++; } printf("あなたの入力した一行の英文は<%s>で、文字数は%dです。\n", str, i); } って方法で文字列の長さを計算しひょうじしてるのですが…。 これだと1単語しか数えられません。 どうしたら1行の長さを表示できるのでしょうか? nullや改行・空白についてがイマイチわかりません。 補足で質問もしようと思いますので付き合ってくれる方がいらっしゃいましたら連絡ください。

  • C言語の標準入力で改行しない方法

    端末で入力を受けて、改行せずに次の表示を行いたいのですが、 char str[32]; printf("ほげほげ"); fgets(str, sizeof(str), stdin); str[strlen(str) - 1] = '\0'; printf("ホゲホゲ"); とすれば 「ほげほげ (入力した内容) ホゲホゲ」 と表示できると考えましたが、これでは改行されて 「ほげほげ (入力した内容) ホゲホゲ」 になってしまいます。原因がわかりません… 使用している環境は Linux Ubuntu 10.10 で gcc でコンパイルしています。 改行しない方法を説明しているサイトのサンプルをコピペして実行してみても、改行されてしまいました…

  • matlabでの改行文字について

    matlabでのテキストファイルの書き換えを行いたいのですが,改行文字の検出ができません.(C言語では作れますが,matlabで作りたいのです.) 例として以下のファイル(read.txt)の書き換えの方法を教えてください. start 0 1 2 abcdef 0 1 2 3 4 xyz end 上のファイルにおいて,abcdef以下の01234を他のファイルに書き換えたく,以下のスクリプトを作成しました. Path1='read.txt'; Path2='write.txt'; judge=0; Fid1=fopen(Path1,'rt'); Fid2=fopen(Path2,'wt'); while feof(Fid1)==0 Line=fgets(Fid1); if Line=='\n' judge=0; elseif judge==1 fprintf(Fid2,'%s',Line); end if strcmp(Line,'abcdef\n')==1 judge=1; end end fclose(Fid1); fclose(Fid2); end ここで,知りたいのは「Line=='\n'」と「strcmp(Line,'abcdef\n')==1」の条件文がうまく働いてない理由です.これを実行すると何も書かれてないファイルが作成されます. strncmp(Line,'abcdef',6)とするとこちらはうまく認識しますが,改行文字のみの行の検出はどのようにして行えばよいのでしょうか.

  • ファイルの出力

    コマンドラインで指定したファイルの内容を一行ずつ表示するプログラムです。一行表示するごとに次の行も表示するか尋ねます。 #include<stdio.h> #include<stdlib.h> #include<ctype.h> int main(int argc, char *argv[]) {  FILE *fp;  char str[80];  char ch;  if (argc != 2){   printf("コマンドライン引数が違います\n");   exit(1);  }  if ((fp = fopen(argv[1],"r")) == NULL){   printf("ファイルが開けません");   exit(1);  }  while(!feof(fp)){   fgets(str, 79, fp);   if (!feof(fp)) printf("%s",str);   printf("追加しますか?(y/n)");   gets(str);   if ( toupper(*str) == 'N') break;   printf("\n");  }     if (fclose(fp) == EOF){   printf("ファイルを閉じれません\n");   exit(1);  }  return 0; } while文の   gets(str);  if ( toupper(*str) == 'N') break; この部分を  ch = getchar();  if ( toupper(ch) == 'N') break; でやると上手く実行できないのですが、なぜでずか?

  • fgetsの処理を詳しく説明してください、お願いします。

    char line[100]; (stream = fopen( "test.c", "r" )) == NULL; while( ( fgets( line, 100, stream ) != NULL)){ printf( "%s", line); } fclose( stream ); 上記のコードでファイルが一行ずつ表示されるのですがなんとなくでfgetsを使っていたのでwhile文中のfgetsの動きがよく分かりません。 初めに改行文字までの一行を読み込むのはわかるのですが、何故繰り返すときlineに2行目、3行目、・・・ と取り込むのかがわかりません。 よろしくお願いします。

  • エクセルで一つのセル内で空白の行だけ削除したい

    WindowsXP エクセル2003を使用しています。 一つのセル内の空白の行だけを削除したいのですが、方法はありますか? 具体的にはA1内に下記のように入力があります。 -------------------------------------------------------------------- あいうえお かきくけこ さしすせそ たちつてと -------------------------------------------------------------------- 「かきくけこ」と「さしすせそ」の間の空白の行だけ削除したいのですが、可能でしょうか? 他の行の改行はそのまま残したいので、CLEANだと無理でした。

  • エクセル&メモ帳での改行の空白部分のみの削除方法

    エクセルで状態( 1 )を状態( 2 )のように瞬時にしたいのですが、どのようにしたらよろしいのでしょうか? また、状態( 3 )のように空白が不規則な場合もお願いします。 ------------------------------------------ 状態( 1 ) あいうえお かきくけこ さしすせそ たちつてと なにぬねの 状態( 2 ) あいうえお かきくけこ さしすせそ たちつてと なにぬねの 状態( 3 ) あいうえお かきくけこ さしすせそ たちつてと なにぬねの ------------------------------------------ もし、エクセルでできないようでしたら、メモ帳、またはTeraPadでの方法でもいいです。

専門家に質問してみよう