質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

1527閲覧

getlineの後に、fille>>countryをすると無限ループになる(C++)

alizona

総合スコア126

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/10/13 21:52

編集2020/10/14 04:52

自分の住んでいる地域について情報を保存したファイルから、データを読み込んで表示したいです。

C++で、getlineの後に、file>>を使用して、while loopの2周目に入ると、
無限ループになってしまいます。

cin.ignore()や、cin.clear()をつかってリピートを防ごうとしたのですが、
改善できませんでした。

アドバイスをいただけないでしょうか?

###sample.txtの中身は以下です

Tokyo 1丁目 111-222 1

C++

1 #include<fstream> 2 #include<iostream> 3 #include<string> 4 using namespace std; 5 6 int main(){ 7 8 string address; 9 bool japan; 10 ifstream file; 11 file.open("sample.txt"); 12 13 while(!file.eof()){ 14 getline(file, address); 15 file >> japan; 16 } 17 } 18

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2020/10/13 22:17

"C#"は完全に別のプログラミング言語なので、タグは外してください。また、恐らく"C"のタグも必要ありません。
cateye

2020/10/14 00:24 編集

コンパイルできる、ソースを上げて下さい。 また、環境(OS,開発環境等)も記述して下さい。 ・・・addressやcountryの型が分かりません・・・
guest

回答1

0

ベストアンサー

アドバイスをいただけないでしょうか?

ifstream の file を使っているのに、cin の ignore や clear は無意味です。

file.eof() が false だからといって、getline や file >> が成功するとは限りません。
次のように getline や file >> の返した値をチェックしないといけないでしょう。

C++

1 while (getline(file, address) && (file >> country)) { 2 ... 3 }

あるいは、

C++

1 while (true) { 2 getline(file, address); 3 if (file.eof()) break; 4 file >> country; 5 if (file.eof()) break; 6 ... 7 }

getline を実行すると、'\n' まで読み込んで '\n' を捨てますが、
file >> country; を実行した後は、'\n' は入力に残ったままなので、
次の getline で、address は "" になるでしょう。

sample.txt の内容も質問に追加してください。

追記
修正された質問のコードに、
cout << "address [" << address << "], japan: " << japan << endl;
を追加して実行すると

text

1address [Tokyo 1丁目 111-222], japan: 1 2address [], japan: 1

無限ループにはなっていません。

コードを次のようにすると、

C++

1#include <fstream> 2#include <iostream> 3#include <string> 4using namespace std; 5 6int main() 7{ 8 string address; 9 bool japan; 10 ifstream file; 11 file.open("sample.txt"); 12 13 while (getline(file, address) && (file >> japan)) { 14 cout << "address [" << address << "], japan: " << japan << endl; 15 } 16}

address [Tokyo 1丁目 111-222], japan: 1 だけが読めました。

追記2

C++

1#include <fstream> 2#include <iostream> 3#include <string> 4using namespace std; 5 6int main() 7{ 8 string address, tmp; 9 bool japan; 10 ifstream file; 11 file.open("sample.txt"); 12 13 while (getline(file, address) && getline(file, tmp)) { 14 japan = tmp == "1"; 15 cout << "address [" << address << "], japan: " << japan << endl; 16 } 17}

投稿2020/10/14 03:13

編集2020/10/14 06:25
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

alizona

2020/10/14 05:01

'\n'に対応するために、getline(file, tmp);を file>>country; の下に記載したのですが、 他に何かスマートな方法はありますでしょうか?
alizona

2020/10/14 06:15

申し訳ありませんでした。txtファイルの中身に、もう一セットの情報をいれると無限ルーぷになりました。
kazuma-s

2020/10/14 06:22

なぜ、現象の再現する sample.txt を提示しなかったのですか? sample.txt を ------------------------------ Tokyo 1丁目 111-222 1 Osaka 2丁目 123-456 0 --------------------- として、私の示したコードを実行すると、2つめは読み込めませんでしたが、 無限ループにはならずに終了しました。 2つ以上のデータを読めるコードを追加します。
alizona

2020/10/14 09:36

申し訳ありません。 非常に助かりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問