ご覧いただきありがとうございます。
何度も低レベルな質問で申し訳ありません。
A.PRMというファイルに、
I have a pen.
He has a pen.
と2行の文章が入っています。
これを読み取り、printfで画面表示させたいのですが、
#include <stdio.h>
int main(void)
{
FILE *fp;
char a[50];
char b[50];
if( (fp=fopen("A.PRM", "r" )) != EOF ) {
fgets( a, 49, fp );
fgets( b, 49, fp );
}
fclose( fp );
printf( "a = %s\n", a );
printf( "b = %s\n", b );
return 0;
}
とすると、fgetsで余分な改行が入ってしまいます。
fgetsの代わりにfscanfを使用すると、今度はスペースの前までしか読み込んでくれず、「a = I」「b = He」と表示されてしまいます。
どうしたらよいでしょうか?
是非ご回答いただきたいです。よろしくお願いいたします。
No.3
- 回答日時:
ANo.1 さんが適切な回答をされていますね。
きっと一発で改行文字を読まないようなコードが欲しいんだと
思いますが、改行が付いてしまうのはfgetsの仕様なので
あきらめてください。
代りと言っては何ですが、
改行コードを取り除く関数を考えてみました。
char* trim(const char* buffer)
{
char *p = (char*)buffer, *q = p;
while (*p && *p != '\n') p++;
*p = 0;
return q;
}
漢字が入っていたらもうちょっと複雑ですが、
ASCII等の英数字記号だけならこれでいいと思います。
呼び出しは、
/* 改行コードを取り除く処理 */
trim(a);
みたいな感じで呼び出せばよいかと。
ご参考までに。
大変遅くなりましたが、ご回答ありがとうございました。
どうもライブラリ関数によって一発解決しようと考えてしまうようです。自作関数なども考慮に入れ、ロジックを追求しようと思います。
コードの記述ありがとうございます。
No.2
- 回答日時:
> fgetsの代わりにfscanfを使用すると、今度はスペースの前までしか読み込んでくれず、「a = I」「b = He」と表示されてしまいます。
それは書式指定が悪いからです。
fscanf(fp, "%49[^\n]%*c", a);とすれば解決できるはずです。もっとも、入力が50文字以上になった場合の対策を行うにはもう一工夫必要ですが、それはfgetsの場合でも同じです。
大変遅くなりましたが、ご回答ありがとうございました。
書式指定についてはまったく知りませんでした。この方法を試してみようと思います。
No.1ベストアンサー
- 回答日時:
★最初に fopen 関数の戻り値は『NULL』でチェックします。
・fgets で余分な改行が入りますので、strchr 関数などで検索して \0 文字に書き換えて
ヌル文字を削除して下さい。
・改行コードの取り除き方は、次の関連質問の回答者 No.3 や他の回答者さんの方法を
試して下さい。下の『参考URL』をどうぞ。
・あと fclose 関数の位置が間違っています。fopen ブロック内に記述しましょう。
サンプル:
int main( void )
{
FILE *fp;
char a[50];
char b[50];
if ( (fp = fopen("A.PRM", "r" )) != NULL ){ ←EOF ではなく NULL です。
if ( fgets(a,sizeof(a),fp) != NULL ){ ←sizeof演算子を使うと便利です。
/* 改行コードを取り除く処理 */
}
if ( fgets(b,sizeof(b),fp) != NULL ){ ←sizeof演算子を使うと便利です。
/* 改行コードを取り除く処理 */
}
fclose( fp ); ←この位置です。
}
printf( "a = %s\n", a );
printf( "b = %s\n", b );
return( 0 );
}
最後に:
・fgets 関数も戻り値をチェックした方がいいですよ。
・以上。おわり。
参考URL:http://oshiete1.goo.ne.jp/qa2897482.html
大変遅くなりましたが、ご回答ありがとうございました。
ご指摘いただいたミスは、自分では正しく記述したつもりでいました‥
関数の仕様ももちろんですが、どうしたらその問題点を解決できるかをもっと自分で考え抜いた方が良いことに気づかせてくれた回答でした。
コード記述ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAのコマンドボタンの文字列の...
-
エスケープ文字の復帰(¥r)と...
-
ソースコードの1行が長いとき...
-
ファイルから読み取った改行文...
-
C++でのCRLFについて
-
改行について
-
エディットボックスの改行
-
JAVA System.out.println の ...
-
テキストファイルから改行コー...
-
C++で空Enterの入力を判...
-
C# csvでセル内で改行するには
-
エクセルVBA 文字列領域が不足...
-
グレープシティのSPREAD...
-
C++のctime関数復帰値の改行
-
fscanf関数について
-
「続行するには何かキーを押し...
-
【Tex】\\verbatiminputについて
-
VB6でブラウザのページソースを...
-
VBAでCSVをExcelに取り込む時に...
-
vbsで2文字以上の空白を改行に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAのコマンドボタンの文字列の...
-
ソースコードの1行が長いとき...
-
エスケープ文字の復帰(¥r)と...
-
ファイルから読み取った改行文...
-
JAVA System.out.println の ...
-
C++で空Enterの入力を判...
-
COBOLの改行
-
テキストファイルから改行コー...
-
改行について
-
【VBA】エクセルで最後の不要な...
-
1行ごとに取得して、その改行...
-
jsp 改行コードで改行させて表...
-
VBAでCSVをExcelに取り込む時に...
-
エクセルVBA 文字列領域が不足...
-
最終行の改行について
-
改行を読み飛ばす
-
コンボボックスの項目中に改行を
-
ExcelVBAでメールを作成してメ...
-
テキストボックス行の桁数を制...
-
JavaMail,本文中の改行について
おすすめ情報