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

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

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

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

Q&A

2回答

4203閲覧

io一文字ずつ書き込みたい

reotantan

総合スコア295

C++

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

0グッド

0クリップ

投稿2015/11/04 18:12

文字列を記入し、さらにそのファイルを読み込んでスクリーンに出力するファイルを書きました。
確認のために一文字一文字書き込みながら、tellgで1,2,3,4というように出力したいのですが、
char str[100];をつくり
thisfile.strにしたところうまくいきません。
コードの例をいだけるととても助かります。
よろしくおねがいします

int main () { string line; ofstream myfile("example.txt"); if(myfile.is_open()){ myfile << "Writing this to a file.\n"; myfile.close(); } ifstream thisfile("example.txt"); if(thisfile.is_open()){ while(getline(thisfile,line)){ cout<<thisfile.tellg()<<endl; cout<<line<<"/n"<<endl; } cout<<thisfile.eof(); myfile.close(); } return 0; }

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

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

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

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

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

guest

回答2

0

「一文字一文字書き込みながら、tellgで1,2,3,4というように出力したい」というのは、ファイルから1文字ずつ読み取って1文字ずつスクリーンに出力するという意味でよろしいでしょうか。
であれば、getlineではなくgetメソッドを使うのが簡単でよろしいかと思います。

こんな感じで

int ch; while(ch = thisfile.get(), ch != char_traits<char>::eof()) { cout << thisfile.tellg() << endl; cout << static_cast<char>(ch) << endl; }

ただし、上記コードでは仮名・漢字などの非ASCII文字を正しく扱えません。非ASCII文字を1文字ずつ処理するにはいろいろ工夫が必要になります。

投稿2015/11/05 01:40

catsforepaw

総合スコア5938

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

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

0

イメージ説明
tellg関数の戻り値は operator<<でサポートされた型ではありません.明示的にint型にキャストする必要があります.

C++

1std::cout << static_cast<int>( thisfile.tellg() ) << std::endl;

ちなみに,std::endlは改行とフラッシュを同時に行うものです.多用すると速度低下につながりますので,改行したいだけなら"\n"をつかい,<< で連結させるのがよいでしょう.
std::endlは最後につければよいです.明示的なフラッシュが必要な場合はほとんどありません.

投稿2015/11/04 19:49

編集2015/11/04 19:51
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

catsforepaw

2015/11/05 01:53

tellgメソッドの戻り値を明示的にキャストする必要はありませんよ。 tellgメソッドの戻り値はstreamposでfpos<char_traits<char>::state_type>のtypedefですが、fposクラスにはstreamoffへの型変換(operator streamoff)が備わっています。streamoffはlong longのtypedefなので、そのままoperator<<に渡せば自動でlong longに変換して処理してくれます。 それと、スクリーン(cout)への出力では、1行ごとにendlを出力した方が良い場合があります。リモート端末ではフラッシュしないと画面に反映されないことがあるので。
退会済みユーザー

退会済みユーザー

2015/11/05 05:37

確認しました.昔のコードだとキャストが必要だったと思うんですが,そのままの認識で覚えていて,対して中身見てませんでした.申し訳ないです. ありがとうございます! 最後にendlしても部分的にしか反映されないということですか?
catsforepaw

2015/11/05 08:11

だいぶ前の経験で現在は手元に環境がないので確認はできないのですが、コンソールへの出力に'\n'で改行させていたところ、ローカル(Linuxのデスクトップ上の端末)では1行ごとに表示されていたのに、リモートでログインした端末では複数行まとめて表示されるため、仕方なく毎行フラッシュしていたといったことがありました。その後、endlがフラッシュも兼ねているということで'\n'ではなく、endlを使うようになったということがあったのです。
catsforepaw

2015/11/05 08:15

ちょっと言葉足らずでした。何をやっていたかというと、いわゆるprintfデバッグのようにデバッグ情報をコンソールに表示してプログラムの動作を確認しようとしていたのですが、リアルタイムに表示されないことが問題だったのです。
退会済みユーザー

退会済みユーザー

2015/11/05 10:43

なるほど,デバッグだと確かにendlのほうがいいですね.そしてそれは,この質問もデバッグでの出力なので適用されますね.ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問