
以下のようなファイルを読み込みたいのですが….
--------------------------------------------------
あいうえを
かきくけこ
さしすせそ
たちつてと
--------------------------------------------------
のように1行文字列があって,1行空白行(改行のみ)があって…のような繰り返しのファイルなんですが,空白行を読み飛ばして続けて
--------------------------------------------------
あいうえお
かきくけこ
さしすせそ
たちつてと
--------------------------------------------------
のように表示させる場合はどのように書いたらよいですか?
--------------------------------------------------
while(fgets(str,256,fpin)){
if(strcmp(str,"\n")!=0){
printf("%s\n",str);
}
}
--------------------------------------------------
と書いたのですが,空白行も表示されてしまいます.
何か間違えているでしょうか?
それとも実はファイルの空白行は改行じゃないとかでしょうか?
A 回答 (7件)
- 最新から表示
- 回答順に表示
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 でも正常に動作するはずです。→私は未確認。
・以上。おわり。→結果報告をお願いします。
No.6
- 回答日時:
ANo.5 です。
strtokの使い方が悪かったので訂正しておきます。
while(fgets(str,256,fpin)){
if (strtok(str, "\x0d\x0a") != NULL){
printf("%s\n",str);
}
}
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);
}
}
No.4
- 回答日時:
回答1の方と被るのですが、LinuxなどのOS上でWindowsで作られた改行つきファイルを読み込む、となると改行コードの違いが出てきます。
(VC(Windows)で同様のコードの実行ファイルを作成し、Windows上で作成したテキストファイルを使って実験したところ、うまくいきましたので…)その場合の判定は
if(strcmp(str, "\r\n") != 0){
ではないかと思います。
はずれていたらすみません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
c言語でのfscanfについて
C言語・C++・C#
-
C言語初心者の質問失礼します。
C言語・C++・C#
-
fgetsで拾われる改行文字を削除したい
C言語・C++・C#
-
-
4
バッファとは何ですか
C言語・C++・C#
-
5
テキストファイルの空行をスキップして次の行をリードする
C言語・C++・C#
-
6
fgets関数を使用したときの文字あふれについて
C言語・C++・C#
-
7
fgetsなどのときのstdinのバッファを消すには?
C言語・C++・C#
-
8
テキストデータをそのままバイナリへ
C言語・C++・C#
-
9
ファイルの結合
C言語・C++・C#
-
10
fgets関数のEOFの扱い方について
C言語・C++・C#
-
11
構造体のメンバをfor文で回したい
C言語・C++・C#
-
12
C言語 ファイルの指定された行を表示
C言語・C++・C#
-
13
ファイルから読み取った改行文字を消す方法
C言語・C++・C#
-
14
文字列から空白を取り除きたいのですが
C言語・C++・C#
-
15
C言語 配列の長さの上限
C言語・C++・C#
-
16
C言語で特定列だけを抽出して配列に格納し、出力したいです。 読み込みファイル(read.txt) 0
C言語・C++・C#
-
17
変数の値が勝手に変化する原因
C言語・C++・C#
-
18
【C言語】構造体内の領域解放(free)の仕方
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAのコマンドボタンの文字列の...
-
ToolTipTextの改行はできないの...
-
ダイアログにおける改行
-
VBAでCSVをExcelに取り込む時に...
-
ソースコードの1行が長いとき...
-
ラベル(スタティックテキスト)...
-
【VBA】エクセルで最後の不要な...
-
マクロでセル内の改行を削除す...
-
エクセルVBA 文字列領域が不足...
-
delphi でのコード上でTab を入...
-
変数の中の改行コードをBRタグ...
-
エディットボックスで改行
-
エスケープ文字の復帰(¥r)と...
-
ButtonコントロールのT...
-
文字列型変数に1024を超えた文...
-
Excel VBS、ADODB.Streamで改行
-
バイナリファイルに改行コード...
-
POSTで改行コードを受け渡すには
-
バーコード入力と手入力の判断...
-
COBOLの改行
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAのコマンドボタンの文字列の...
-
エスケープ文字の復帰(¥r)と...
-
ソースコードの1行が長いとき...
-
COBOLの改行
-
C++で空Enterの入力を判...
-
Excel VBAからBeckyを起動して...
-
【VBA】エクセルで最後の不要な...
-
エクセルVBA 文字列領域が不足...
-
テキストボックス行の桁数を制...
-
秀丸の正規表現で複数行にわた...
-
C言語の標準入力で改行しない方法
-
VBAでCSVをExcelに取り込む時に...
-
改行コード(CR/LF)の設...
-
グレープシティのSPREAD...
-
改行について
-
1行ごとに取得して、その改行...
-
ラベル(スタティックテキスト)...
-
コンボボックスの項目中に改行を
-
ファイルから読み取った改行文...
-
C# DataGridViewのセルを改行禁...
おすすめ情報