お世話になります。
早速質問させていただきます。
言語はC++です。
ファイルに、以下の文字列があったとします。
============================
123456789012
12345678901
1234567890
123456789
============================
この時、
fgets( str, 10, fp);
printf("str (%2d)= %s\n", strlen(str), str);
を、EOFになるまで繰り返します。
すると、実施結果は
============================
123456789
012
123456789
01
123456789
0
123456789
============================
となります。
これは、fgetsで10というレングスを指定しているために、1行読み込んで、10文字以降の文字列はバッファに残ってしまっているため、
2度目のfgetsで、10文字以降の文字列が読み込まれ、書き出されているものと思われます。
この時、fgetsで1行読み込んだ後、バッファに残った文字列を無視し、2度目のfgetsで、2行目を読み込むにはどうしたらよいでしょうか?
有識者の方、ご教授ください。よろしくお願いします。
No.2ベストアンサー
- 回答日時:
たぶん、質問にストレートに答えれば「fflush()を使う」になるのだと思います。
もしかしたら、キー入力に限定すればそれでうまくいくかも知れませんが、あまりスマートな方法とは思えません。
結果的に何をしたいのかが不明なので、答えが難しいですが、通常は fgets()で必要量以上のエリア(strの代わりになるもの)に1行まるまる読み込んでから、必要分だけをstrなどに格納するのが入力媒体に依存しない確実な方法となります。
あるいは、strの先頭10文字だけと言うのならば、strに1行読み込んだ後に、
printf("%10.10s\n",str);
と言う手もあると思います。
これはstrの内容をどうしたいのかで、正解は違ってきますが、どちらにしてもfgets()では1行読み込むようにしましょう。
数バイトのメモリーをケチっても、誰も得はしませんので、どんどん使いましょう。
参考URL:http://www9.plala.or.jp/sgwr-t/lib/fflush.html
ご回答ありがとうございました。
こちらとしても、当初はfflushを使用して実施したのですが上手くいかず、他に代用できる標準関数があるかもしれないと思い、質問させていただいた次第でした。
しかし、ghyytucvukさんの助言と、他の方々の助言を拝見し、やはり、力業でファイルポインタを移動するしかないのだという結論に至りました。
僭越ながら、最も分かり易い文章として参考にさせていただきました、ghyytucvukさんの助言をベストアンサーとさせていただきます。
ご助力ありがとうございました^^
No.4
- 回答日時:
No.2です。
No.3さん、そこ、こだわる?重要?
質問にストレートに答えれば
fflush(fp);
となるのでしょうが、No.3さんの言われているように未定義でしたね。
済みません。
でも、私も「もしかしたら」と書いているし、推奨しているわけではないですし、揚げ足取りと言われても仕方がないような。
当然、私の回答のそれ以降に関しての指摘がないと言うことは、それは正しいと言うことなのですよね。
一部が違うから、全部が違うという意味ではないですよね。
No.3
- 回答日時:
>「fflush()を使う」
引数は何ですか?
stdoutあたりだったら何も問題はありませんが、
例えば
fflush(stdin);
と書くのは動作未定義です。
fflush()は出力バッファをクリアするために使うのでありまして、
入力バッファをカラにするために使う「のではありません」。
No.1
- 回答日時:
> printf("str (%2d)= %s\n", strlen(str), str);
> すると、実施結果は
...とはなりませんよね。 str(XX)=の部分が表示されてませんから。
それはともかく
1行最後まで読み込めたら、改行文字がstrに含まれます。
なので
・str[strlen(str)-1] == '\n' かどうか調べる
→ true: fgetc(fp)などで '\n'になるまで読み飛ばす
というのがやりかたの一つです。
改行無しにEOFになる場合等のエラー処理は忘れずに。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# [C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について 5 2022/10/05 11:03
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- Excel(エクセル) PowerQueryに詳しい方教えてください(Office365) 1 2022/07/24 21:11
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- その他(プログラミング・Web制作) python質問 1 2023/08/14 11:54
- その他(プログラミング・Web制作) プログラミング python pandas 固定長データの出力 2 2022/08/16 11:22
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
sscanfとscanfの違いがよくわか...
-
CStringのFindで文字列検索を行...
-
反転した数値を表示させるやり方
-
C言語で16進数文字列から16進数...
-
fgets関数を使用したときの文字...
-
小文字のみを数える方法
-
記号を入出力する際の指定子
-
strstrを利用しない文字列検索...
-
itoaわかりません
-
C言語:配列の中の文字を。。。
-
2進数から10進数へ変換プログラム
-
C言語のステップ数をカウントす...
-
[Java]文字列分割
-
10進数文字列の変換
-
Cで「大文字、小文字の判定」は...
-
charと%c , %s の関係について
-
へんな現象
-
Enterキーを押されたら次の処理...
-
#define _CRT_SECURE_NO_WARNIN...
-
マイナスからプラスへ転じた時...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CStringのFindで文字列検索を行...
-
sscanfとscanfの違いがよくわか...
-
反転した数値を表示させるやり方
-
fgets関数を使用したときの文字...
-
C言語 空白の行(改行のみ)が...
-
charと%c , %s の関係について
-
C言語のステップ数をカウントす...
-
fgetsで拾われる改行文字を削除...
-
itoaわかりません
-
C言語で16進数文字列から16進数...
-
strstrを利用しない文字列検索...
-
文字列中に含まれる文字の個数...
-
Cで「大文字、小文字の判定」は...
-
エディットボックスに入力され...
-
1行の文字列を時間差で表示する...
-
文字列の途中に「0」がある場...
-
[Java]文字列分割
-
教えていただけませんか?C言語...
-
atoiでの文字列以外のエラー処...
-
ブランクのチェック
おすすめ情報