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

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

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

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

Q&A

解決済

2回答

1942閲覧

出入力c++

reotantan

総合スコア295

C++

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

0グッド

0クリップ

投稿2015/10/28 23:16

入出力のコードを書いていたのですが、エラーがでてしまいます。
問題点を指摘してくださるとうれしいです。

コード /* * stream.cpp * * Created on: 2015/10/29 * Author: 礼央 */ #include<iostream> #include<sstream> #include<fstream> int main() { using namespace std; ostringstream strbuf; int lucky = 7; float pi = 3.14; double e = 2.71; // cout << "An in-memory stream" << endl; strbuf << "luckynumber:" << lucky << endl << "pi:" << pi << endl << "e:" << e << endl; string strval = strbuf.str(); cout << strval; ofstream outf; outf.open("mydata"); outf << strval; outf.close(); cout << "Read data from the file-watch for errors" << endl; string newstr; ifstream inf; inf.open("mydata"); if (inf) { int lucky2; inf >> newstr >> lucky2; if (lucky != lucky2) cerr << "error! wrong" << newstr << lucky2 << endl; else cout << newstr << "OK" << endl; float pi2; inf >> newstr >> pi2; if (pi2 != pi) cerr << "Error! wrong" << newstr << pi2 << endl; else cout << newstr << "OK" << endl; double e2; inf >> newstr >> e2; if (e2 != e) cerr << "ERROR:Wrong" << newstr << e2 << endl; else cout << newstr << "OK" << endl; inf.close(); } }

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

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

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

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

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

guest

回答2

0

ベストアンサー

istreamから>>でstring型変数へ読みだすと、次の区切り記号(whitespace)までを読み出します。
区切り記号はスペースやタブ文字や改行文字のようです。
これらの区切り記号を挟まずに数値を出力しているため、:の後の数字もnewstrに読まれてます。

フォーマットを変えてよいなら、:の後に1つスペースを挟むだけで解決します。

フォーマットを変えない場合は、getlineの区切り記号指定版を使うことも考えられます。
下記のように使います。
getline(inf, newstr, ':') >> lucky2;

ただ、':'を区切り記号にことで
①改行文字がnewstrに読まれてしまいます。
②':'はnewstrに読まれません。
①の影響が結構鬱陶しいし、対策は「汚く」なります。

少し面倒になりますが、行単位でstring型変数へ読み込んでfind_first_ofやfind_first_not_ofを使う定石的な方法を使った方がgetlineを使うより良いかも知れません。

投稿2015/10/29 02:38

編集2015/10/29 03:04
Chironian

総合スコア23272

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

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

0

std::ifstream operator>>( std::ifstream& ifs, std::string& str )
を確認しましょう.デフォルトでは数字も「:」も含めて全部読み取ります.
以下のようにオーバーライドするか,operator>>ではない独自関数を作って,そっちに任せましょう.

C++

1#include<iostream> 2#include<sstream> 3#include<fstream> 4#include<cctype> 5 6std::ifstream& operator>>( std::ifstream& ifs, std::string& str ) 7{ 8 char check = 0; 9 if ( ifs >> check ) 10 { 11 str += check; 12 while ( isalpha( check ) && ifs.get( check ) ) 13 { 14 str += check; 15 } 16 } 17 else 18 { 19 ifs.setstate( std::ios_base::failbit ); 20 } 21 22 return ifs; 23} 24 25int main() { 26 using namespace std; 27 ostringstream strbuf; 28 29 int lucky = 7; 30 float pi = 3.14; 31 double e = 2.71; 32 // 33 cout << "An in-memory stream" << endl; 34 strbuf << "luckynumber:" << lucky << endl << "pi:" << pi << endl << "e:" 35 << e << endl; 36 37 string strval = strbuf.str(); 38 cout << strval; 39 40 ofstream outf; 41 outf.open("mydata.txt"); 42 outf << strval; 43 outf.close(); 44 45 cout << "Read data from the file-watch for errors" << endl; 46 string newstr; 47 ifstream inf; 48 inf.open("mydata.txt"); 49 if (inf) { 50 int lucky2; 51 inf >> newstr >> lucky2; 52 if (lucky != lucky2) 53 cerr << "error! wrong " << newstr << ", " << lucky2 << endl; 54 else 55 cout << newstr << "OK" << endl; 56 57 float pi2; 58 59 inf >> newstr >> pi2; 60 if (pi2 != pi) 61 cerr << "Error! wrong " << newstr << ", "<< pi2 << endl; 62 else 63 cout << newstr << "OK" << endl; 64 65 double e2; 66 inf >> newstr >> e2; 67 if (e2 != e) 68 cerr << "ERROR:Wrong " << newstr << ", " << e2 << endl; 69 else 70 cout << newstr << "OK" << endl; 71 inf.close(); 72 }

投稿2015/10/29 00:09

編集2015/10/29 01:06
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Chironian

2015/10/29 02:59

>以下のようにオーバーライドするか,operator>>ではない独自関数を作って,そっちに任せましょう. 標準ライブラリに既に存在している関数(http://www.cplusplus.com/reference/string/string/operator%3E%3E/)の動作を変えると混乱が生じやすいので、別関数を定義した方がより安全と思います。
退会済みユーザー

退会済みユーザー

2015/10/29 03:43

自分も別のアプローチしたほうが絶対いいよなぁこれと思いながら書いてましたw
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問