C++に関するスケジュール
C++に関するスケジュール
くそお、最近ストレスがたまる。
それはおいといて、アドバイスがほしい
自分のプログラミング経験: 明解C(入門)→プログラミング言語C[B.W.カーニハン/D.M.リッチー]→ポインタ完全制覇[前橋和弥]
現在: 独習C++(今月中に終わる予定) 詳説正規表現、perl(時間があれば)
これから: STLによるC++プログラミング→ Effective C++ → Effective STL → Modern C++ Design →Advanced Windows
皆さんならどれぐらいの期間かかるのだろうか?もしどうしても9ヶ月程度でマスターしたいのであれば日に何時間勉強すればいい?
(この調子だとLispやLinuxに手を出すのは何年後になるのやら・・・)
それはおいといて、アドバイスがほしい
自分のプログラミング経験: 明解C(入門)→プログラミング言語C[B.W.カーニハン/D.M.リッチー]→ポインタ完全制覇[前橋和弥]
現在: 独習C++(今月中に終わる予定) 詳説正規表現、perl(時間があれば)
これから: STLによるC++プログラミング→ Effective C++ → Effective STL → Modern C++ Design →Advanced Windows
皆さんならどれぐらいの期間かかるのだろうか?もしどうしても9ヶ月程度でマスターしたいのであれば日に何時間勉強すればいい?
(この調子だとLispやLinuxに手を出すのは何年後になるのやら・・・)
Re: C++に関するスケジュール
LispやLinuxを扱うのにC/C++をマスターする必要性はありません。今日にでも初めてみては?
あと読んだ本を「プログラミング経験」というのはちょっと違うと思いますよ。
実際にコードを書くのがプログラミングですから。
あと読んだ本を「プログラミング経験」というのはちょっと違うと思いますよ。
実際にコードを書くのがプログラミングですから。
Re: C++に関するスケジュール
演習問題もプログラミングのうちだと思いますが、
書名を列挙されても回答する際の参考にはならないですね。
書名を列挙されても回答する際の参考にはならないですね。
Re: C++に関するスケジュール
せっかくだし。トピックを有効利用しよう!
下のプログラム:ファイルの文字列を2文字1組として順番を変える 例:)awe78 → wa7e8 , 48fe2w → 84efw2となる
(*2バイト文字については考慮しない)
そして11行目をコメントにするとうまく動作しない。そのままにするとうまく動作する。
初心者の自分には難しい過ぎる問題で、だれかたすけて
下のプログラム:ファイルの文字列を2文字1組として順番を変える 例:)awe78 → wa7e8 , 48fe2w → 84efw2となる
(*2バイト文字については考慮しない)
そして11行目をコメントにするとうまく動作しない。そのままにするとうまく動作する。
初心者の自分には難しい過ぎる問題で、だれかたすけて
#include<iostream>
#include<fstream>
using namespace std;
int main(){
char c[2];
fstream fio("text",ios::in | ios::out | ios::binary);
if(!fio) return 1;
while(!fio.eof()){
cout << fio.tellg() << ' ' << fio.tellp(); //この一行をコメントにするとうまく動作しない
fio.get(c[0]);
fio.get(c[1]);
if(c[1]==EOF) continue;
fio.seekp(-2,ios::cur);
fio.put(c[1]);
fio.put(c[0]);
}
if(c[1]==EOF) fio.put(c[0]);
fio.close();
return 0;
}
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: C++に関するスケジュール
> 皆さんならどれぐらいの期間かかるのだろうか?もしどうしても9ヶ月程度でマスターしたいのであれば日に何時間勉強すればいい?
9ヶ月だと底の浅い知識しか身につかない可能性が高いと思います。
色々苦心惨憺して身につくものです。
あと練習問題やAOJ(会津オンラインジッジ)など小規模のコードをいくら書き連ねても実はある程度規模以上のプログラムを組めるようになりません。
つまり、実用的なアプリやゲームを組める実力が身につかいないのです。
ズバリ!それを身につける方法は失敗を繰り返しても良いので、ある程度規模以上のアプリやゲームを理解したい機能を駆使して苦労して組むことです。
それと問題のコードですが、書かないうちに読むのは動作未定義じゃないかと思うわけです(調べてないので断言はできません)。
なので動いたり動かったなかったりで、処理系に依存したりすると思います。
システムの裏をつくようなコードを書く癖は改めたほうが私は良いと思いますよ。
9ヶ月だと底の浅い知識しか身につかない可能性が高いと思います。
色々苦心惨憺して身につくものです。
あと練習問題やAOJ(会津オンラインジッジ)など小規模のコードをいくら書き連ねても実はある程度規模以上のプログラムを組めるようになりません。
つまり、実用的なアプリやゲームを組める実力が身につかいないのです。
ズバリ!それを身につける方法は失敗を繰り返しても良いので、ある程度規模以上のアプリやゲームを理解したい機能を駆使して苦労して組むことです。
それと問題のコードですが、書かないうちに読むのは動作未定義じゃないかと思うわけです(調べてないので断言はできません)。
なので動いたり動かったなかったりで、処理系に依存したりすると思います。
システムの裏をつくようなコードを書く癖は改めたほうが私は良いと思いますよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: C++に関するスケジュール
ふむふむ。まぁ一言で言うと俺はニートだ!!
時間だけはたっぷりとあるからな。
言語の仕様や機能を一通り理解したら、アプリやゲームとか作ろうと思ってるよ。
例のコードだが、実を言うと11行目に tellp() もしくは tellg() が呼び出されていればうまく動作する。
そこで tellp() もしくは tellg() の内部動作について知りたかったんだが・・・
まぁマイペースでやっていくよ
時間だけはたっぷりとあるからな。
言語の仕様や機能を一通り理解したら、アプリやゲームとか作ろうと思ってるよ。
例のコードだが、実を言うと11行目に tellp() もしくは tellg() が呼び出されていればうまく動作する。
そこで tellp() もしくは tellg() の内部動作について知りたかったんだが・・・
まぁマイペースでやっていくよ
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: C++に関するスケジュール
言葉遣いにはご注意いだけると幸いです。ただの屍のようだ さんが書きました:ふむふむ。まぁ一言で言うと俺はニートだ!!
時間だけはたっぷりとあるからな。
言語の仕様や機能を一通り理解したら、アプリやゲームとか作ろうと思ってるよ。
例のコードだが、実を言うと11行目に tellp() もしくは tellg() が呼び出されていればうまく動作する。
そこで tellp() もしくは tellg() の内部動作について知りたかったんだが・・・
まぁマイペースでやっていくよ
フォーラムルール上、掲示板上の騒動の原因となるため禁止行為とさせていただいています。
http://dixq.net/board/board.html
内部動作に関しては申し上げた通り知らないほうが良いともう一度書かさせて頂きます。
VC++で通用してもgccで通用しない方法に何の意味があるかと考えてもらえば自明かと。
ちなみにstreamはテンプレートですので、ソースコードを見ることはもちろん可能ですでコードを読まれたどうでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: C++に関するスケジュール
読み書きモードで開いたファイルで、読み→書き、あるいは、書き→読みを切り替えるときは、シーク操作を挟む必要があります。
代わりに
fio.seekp(0,ios::cur);
を入れてみてください。
これは仕様です。
C言語の標準ライブラリでも同様です。
代わりに
fio.seekp(0,ios::cur);
を入れてみてください。
これは仕様です。
C言語の標準ライブラリでも同様です。
Re: C++に関するスケジュール
VC++2012で試すとまともに動かない(というか止まらない)のですけど、規格的に正しいコードなんでしょうか。
charとEOFを比較している時点で怪しいですけど。
charとEOFを比較している時点で怪しいですけど。
Re: C++に関するスケジュール
自分が覚えている限り、Cの仕様では半角文字は0~255
そしてEOFはどの文字にもなりえない-1のはずです。
そこでchar変数に-1を代入して整数として表示させてみてください。
*すくなくとも自分の環境では普通に動いてますよ
そしてEOFはどの文字にもなりえない-1のはずです。
そこでchar変数に-1を代入して整数として表示させてみてください。
*すくなくとも自分の環境では普通に動いてますよ
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: C++に関するスケジュール
それではcharに255を代入して表示させてみてください。ただの屍のようだ さんが書きました:自分が覚えている限り、Cの仕様では半角文字は0~255
そしてEOFはどの文字にもなりえない-1のはずです。
そこでchar変数に-1を代入して整数として表示させてみてください。
*すくなくとも自分の環境では普通に動いてますよ
あと環境限定は、あとあと困ることになりますよ。
※ 事実上Windows標準のVS2012で動かないのはマズイのでは?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: C++に関するスケジュール
規格的には未規定の振る舞いかなぁ,と。ISLe さんが書きました:VC++2012で試すとまともに動かない(というか止まらない)のですけど、規格的に正しいコードなんでしょうか。
charとEOFを比較している時点で怪しいですけど。
INCITS/ISO/IEC 14882:2011 27.7.2.3 Unformatted input functions ¶6には,
とだけあり,cにEOFを代入するとは書いてありません。6 Effects: Behaves as an unformatted input function (as described in 27.7.2.3, paragraph 1). After constructing a sentry object, extracts a character, if one is available, and assigns it to c. Otherwise, the function calls setstate(failbit) (which may throw ios_base::failure (27.5.5.4)).
要出典。ただの屍のようだ さんが書きました:自分が覚えている限り、Cの仕様では半角文字は0~255
そしてEOFはどの文字にもなりえない-1のはずです。
仕様を語るなら規格のどこにあるのかを示せるはずです。
私の知る限り,ISO/IEC 9899に「半角文字」に相当する単語は出てこなかったはず。
オフトピック
PDFでhalfwidthを検索すると見つからず,halfは
- half-strip
- cacosh
- half-plane
- csqrt
- G.6の複素関数での説明
- halfway
- round
- lround, llround
char型が符号付きか符号無しかはimplementation-definedです (ISO/IEC 9899:1999 6.2.5 Types ¶15)。 が-1になるのかそうでない正の値になるのかは,実装に依存します。ただの屍のようだ さんが書きました:そこでchar変数に-1を代入して整数として表示させてみてください。
実装に依存する結果だけから仕様を推測するのは危険ですよ。
オフトピック
ついでにいえば,CHAR_BITが8とは決まっていないし,SCHAR_MAXが127だとも,UCHAR_MAXが255だとも決まっていない。
さらに,負数の表現に2の補数を使うことも決まっていない。
さらに,負数の表現に2の補数を使うことも決まっていない。
Re: C++に関するスケジュール
そうですね。intでいいと思います。
それはそうと、intがcharに変わったところで自分のコードが無限ループするとは思いません。
理由:たとえEOFがうまく返されなかったとしても、ファイルの終わりに達していればwhile文から抜け出せます。
(ループの判定はあくまで!fio.eof()ですので)
ほんとうに自分のコードそのままコピーしただけで、無限ループに陥ったのでしょうか
もし、そうでしたら。こちらではどうやっても無限ループにならないので力にはなれませんが原因究明お願いします。
それはそうと、intがcharに変わったところで自分のコードが無限ループするとは思いません。
理由:たとえEOFがうまく返されなかったとしても、ファイルの終わりに達していればwhile文から抜け出せます。
(ループの判定はあくまで!fio.eof()ですので)
ほんとうに自分のコードそのままコピーしただけで、無限ループに陥ったのでしょうか
もし、そうでしたら。こちらではどうやっても無限ループにならないので力にはなれませんが原因究明お願いします。
Re: C++に関するスケジュール
eofはファイル終端に達したときじゃなくて、ファイル終端でさらに読み込んだときに立つフラグです。ただの屍のようだ さんが書きました:(ループの判定はあくまで!fio.eof()ですので)
よくある勘違いですが。
なので1文字目を読み込んだ後にチェックしてないこともおかしいのですよ。
Cygwin版g++で試すと期待通り(?)に動きました。
こちらは書き出し操作でeofフラグが変化するみたいですが規定されていない動作なので保証されません。
VC++では書き出し操作でeofフラグがリセットされて無限ループになるようです。
コードとしてはどこもかしこもまともじゃないです。
このようなコードが本に載っていたのでしょうか。
もし外の世界でも通用するコードを書きたいなら、その本はいますぐ捨てたほうが良いと思います。
Re: C++に関するスケジュール
それだとchar型の値とEOFを比較したら等しくなることはあり得ないですよね。ただの屍のようだ さんが書きました:自分が覚えている限り、Cの仕様では半角文字は0~255
そしてEOFはどの文字にもなりえない-1のはずです。
そこでchar変数に-1を代入して整数として表示させてみてください。
EOFをchar型の変数に代入したらcharで表現できる値に丸められてしまいますからね。
比較自体が無意味ですよね。
Re: C++に関するスケジュール
ふむふむ。やはり、熟練者は頼りになりますね。
ところでだ、本は初心者向けの良書と思いますよ。
実際、fstream.eof()のみでEOFチェックしてますし、もちろん一回目の読み込み直後にもチェック文が入っています。
そう、自分がeof関数を勘違いしたので、一回目のチェック文が無意味に見えただけです。
ついでにいうと、stream.get(char&) = int getc(FILE*)と思ってました。
今後はあせらずに関数の仕様しっかり見るよう気をつけますよ。
(デフォルトでsigned charなら-1は範囲内ですよ。あと自分から本取り除いたらなにも残らないじゃないですかぁ、やだぁ)
ところでだ、本は初心者向けの良書と思いますよ。
実際、fstream.eof()のみでEOFチェックしてますし、もちろん一回目の読み込み直後にもチェック文が入っています。
そう、自分がeof関数を勘違いしたので、一回目のチェック文が無意味に見えただけです。
ついでにいうと、stream.get(char&) = int getc(FILE*)と思ってました。
今後はあせらずに関数の仕様しっかり見るよう気をつけますよ。
(デフォルトでsigned charなら-1は範囲内ですよ。あと自分から本取り除いたらなにも残らないじゃないですかぁ、やだぁ)
Re: C++に関するスケジュール
既にYuOさんが書かれてますが、C/C++言語としてはcharのデフォルトはsigned charでもunsigned charでもどちらでもかまわないことになっています。ただの屍のようだ さんが書きました:(デフォルトでsigned charなら-1は範囲内ですよ。あと自分から本取り除いたらなにも残らないじゃないですかぁ、やだぁ)
unsigned charの場合に正常に動かないのはC/C++言語として不適格なコードということになります。
つまり期待通り動くのは偶然です。