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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

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

Q&A

解決済

2回答

5932閲覧

c++におけるfstreamについて

Daichi

総合スコア47

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

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

0グッド

1クリップ

投稿2015/02/15 17:31

以下のプログラムにおいて、
fstreamの使い方の勉強をしているのですが、
質問です。
text.txtに021までの数字が入っています。
この0
21までの数字のデータを読み込んで出力しようとしているのですが、int型のzではエラーが起きて実行できませんでした。しかし、int型のzをchar型に変更するとうまくtext.txtに入っている数字のデータをzに代入できてうまく出力することができました。

この場合、text.txtに入っている数字のデータはint型では読み込む事ができないのでしょうか??

ご指摘の程よろしくお願いいたします。

int main()
{
vector <int> v;
int i;
int z[1000] = {};
basic_ifstream<int>;
basic_ofstream<int>;

ifstream ifs("text.txt"); ifs >> z; for (i = 0;; i++) { if (z[i] == '\0') break; cout << z[i] << endl; } return 0;

}

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

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

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

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

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

guest

回答2

0

ベストアンサー

ifstreamの場合、そのままでは改行コードが区切りになります。カンマを区切りにしたければ、>>演算子をオーバーロードした読込クラスを作る必要があります。
下記のように改行で区切られたテキストファイルdata.txtがあったとします。

10
20
30

これをifstreamで読み込んでvector<int>に格納するなら、こんな感じになります。

lang

1int main(int argc, char* argv[]) 2{ 3 vector<int> v; 4 ifstream ifs("data.txt"); 5 int num = 0; 6 while (!ifs.eof()) { 7 ifs >> num; 8 if (ifs.good()) v.push_back(num); 9 } 10 for (vector<int>::iterator it = v.begin(); it != v.end(); it++) { 11 cout << *it << endl; 12 } 13 return 0; 14}

投稿2015/02/16 16:08

shinosan

総合スコア209

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

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

Daichi

2015/02/16 16:16

何回も質問して申し訳ないです! ネットでifs.good()と!ifs.eof()の使用方法を調べたりもしていたんですが、 いまいち理解ができません。 ここも教えて頂ければありがたいです!
shinosan

2015/02/16 16:25

eof()やgood()などは、streamの状態を表すフラグを参照するメソッドです。 eofはEnd Of Fileの略で、eof()はファイルを最後まで読み込むとtrueを返します。!はtrue/falseを反転させるので、ファイルに続きがあれば読み込みを続けるわけです。 good()は>>などでの読み込みでエラーが起きない限りtrueを返します。空行や整数に変換できない文字列があれば、読み込んだ結果を捨ててスキップするわけです。
Daichi

2015/02/16 16:42

という事は、good()ではエラー起きた場合は処理が終了するという事ですか??
shinosan

2015/02/16 16:54

eof()やgood()は状態を返すだけなので、読み込み処理そのものは>>演算子で行われます。 このサンプルコードの場合、整数として読み込めなかった場合にはvector<int>に格納しないだけで、読み込み処理はファイルの最後に達するまで続けられます。
Daichi

2015/02/16 17:00

了解です! ご回答ありがとうございました!!!
guest

0

テキストファイルから直接読み出せるのは文字列だけです。
ただ、C++では文字そのものもchar型などの整数なので、-128~127の範囲なら一応用は足せます。
しかし、この場合実際に読みだしているのは文字コードで、テキストファイルにある数値ではないので注意が必要です。
逆に質問ですが、テキストファイルにはどんな形で数値が記述されているのでしょうか?
数値の区切りに何を使っているかで処理が変わってきます。

投稿2015/02/15 22:12

shinosan

総合スコア209

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

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

Daichi

2015/02/15 22:45

ご回答ありがとうございます! 数値と数値の間には何も区切りは入れてなくてどのように処理を行うか悩んでいるところです。 この場合、atoi関数を使えば、int型に変換する事も可能でしょうか??
shinosan

2015/02/15 23:49

まず、入力ファイルにテキストファイルを使いたいのなら、数値を表す文字列を個別に切り出す必要があります。改行や空白、カンマなどが一般的です。 改行を使えば、>>演算子で一行ずつ読み込まれますし、右辺にint型整数を指定すれば自動的に変換されます。
Daichi

2015/02/16 15:34

例えば、10,20,30という風にテキストファイルに出力すると、 ”10”、”,”、”20”、”,”、”30”というように読み込まれるという事でしょうか?? もし右辺にint型整数を指定する場合は、どうにかしてカンマと数字を分けなければ うまく読み込む事ができなくなりますかね??
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問