以下のようなファイルを読み込みたいのですが….
--------------------------------------------------
あいうえを
かきくけこ
さしすせそ
たちつてと
--------------------------------------------------
のように1行文字列があって,1行空白行(改行のみ)があって…のような繰り返しのファイルなんですが,空白行を読み飛ばして続けて
--------------------------------------------------
あいうえお
かきくけこ
さしすせそ
たちつてと
--------------------------------------------------
のように表示させる場合はどのように書いたらよいですか?
--------------------------------------------------
while(fgets(str,256,fpin)){
if(strcmp(str,"\n")!=0){
printf("%s\n",str);
}
}
--------------------------------------------------
と書いたのですが,空白行も表示されてしまいます.
何か間違えているでしょうか?
それとも実はファイルの空白行は改行じゃないとかでしょうか?
A 回答 (7件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
回答1の方と被るのですが、LinuxなどのOS上でWindowsで作られた改行つきファイルを読み込む、となると改行コードの違いが出てきます。
(VC(Windows)で同様のコードの実行ファイルを作成し、Windows上で作成したテキストファイルを使って実験したところ、うまくいきましたので…)その場合の判定は
if(strcmp(str, "\r\n") != 0){
ではないかと思います。
はずれていたらすみません。
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.6
- 回答日時:
ANo.5 です。
strtokの使い方が悪かったので訂正しておきます。
while(fgets(str,256,fpin)){
if (strtok(str, "\x0d\x0a") != NULL){
printf("%s\n",str);
}
}
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 でも正常に動作するはずです。→私は未確認。
・以上。おわり。→結果報告をお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excel 特定セルの数値を参照したセルの0表示が空白にならないのはどうしてか? 3 2022/04/28 22:23
- Excel(エクセル) 列の複数ある空白セルを飛ばして、セルに並べて表示したい 3 2023/02/12 16:49
- Visual Basic(VBA) エクセルVBAについて 2 2023/01/31 16:21
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# pythonのファイルの並びでの読み込みとリストについて 4 2022/04/13 03:52
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- Perl Perlで特定文字列から特定文字列までを抜き出したい 4 2022/04/02 14:24
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- Excel(エクセル) エクセルのAltを押すと「自動保存」「上書き保存」・・・に白抜きの「1」「2」・・・が出る。 2 2023/08/11 11:39
このQ&Aを見た人はこんなQ&Aも見ています
-
風水の観点で選ぶ観葉植物とは?置き場所や上げたい運気ごとの注意点を紹介!
観葉植物で運気をアップするコツを、風水デザイン1級建築士の福島昌彦さんに伺った。
-
c言語でのfscanfについて
C言語・C++・C#
-
テキストファイルの空行をスキップして次の行をリードする
C言語・C++・C#
-
ファイルから読み取った改行文字を消す方法
C言語・C++・C#
-
-
4
ファイル内のデータを1行削除する方法
C言語・C++・C#
-
5
fgetsなどのときのstdinのバッファを消すには?
C言語・C++・C#
-
6
改行までの一文字ずつのファイル読み込み
C言語・C++・C#
-
7
空白を含んだ文字列がうまく格納(表示)できない
C言語・C++・C#
-
8
getcの改行判定
C言語・C++・C#
-
9
C言語---ファイルに出力したデータをすべて消去する方法
C言語・C++・C#
-
10
ファイル出力で改行を入れたい!
C言語・C++・C#
-
11
複数ファイルの同時読み込みの方法と脱初心者向け参考書
C言語・C++・C#
-
12
fscanf関数について
C言語・C++・C#
-
13
テキストファイルの行数を取得する方法(C言語
C言語・C++・C#
-
14
INIファイルからのデータ読込みについて
C言語・C++・C#
-
15
python エラー
その他(プログラミング・Web制作)
-
16
[C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について
C言語・C++・C#
-
17
ファイルから読みこむ方法
C言語・C++・C#
-
18
fopenで別ディレクトリにファイルをオープンしたい
C言語・C++・C#
-
19
<math.h>があるのにsqrtが・・・
C言語・C++・C#
-
20
nullと"、\\0とEOFの違いについて。
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAのコマンドボタンの文字列の...
-
エスケープ文字の復帰(¥r)と...
-
JAVA System.out.println の ...
-
ソースコードの1行が長いとき...
-
jsp 改行コードで改行させて表...
-
LaTeX: captionの中で改行した...
-
改行について
-
emacsの自動改行+インデントに...
-
テキストボックス行の桁数を制...
-
改行を読み飛ばす
-
正規表現の置き換えを使って。...
-
C++で空Enterの入力を判...
-
バーコード入力と手入力の判断...
-
textarea , PHP, 確認画面 改行
-
ExcelVBAでメールを作成してメ...
-
【Tex】\\verbatiminputについて
-
改行だけの行の削除
-
エディットボックスで改行
-
変数に格納している文字列の読...
-
POSTで改行コードを受け渡すには
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAのコマンドボタンの文字列の...
-
ソースコードの1行が長いとき...
-
エスケープ文字の復帰(¥r)と...
-
ファイルから読み取った改行文...
-
JAVA System.out.println の ...
-
C++で空Enterの入力を判...
-
COBOLの改行
-
テキストファイルから改行コー...
-
改行について
-
【VBA】エクセルで最後の不要な...
-
1行ごとに取得して、その改行...
-
jsp 改行コードで改行させて表...
-
VBAでCSVをExcelに取り込む時に...
-
エクセルVBA 文字列領域が不足...
-
最終行の改行について
-
改行を読み飛ばす
-
コンボボックスの項目中に改行を
-
ExcelVBAでメールを作成してメ...
-
テキストボックス行の桁数を制...
-
JavaMail,本文中の改行について
おすすめ情報