C++に関するスケジュール

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ただの屍のようだ

C++に関するスケジュール

#1

投稿記事 by ただの屍のようだ » 7年前

くそお、最近ストレスがたまる。
それはおいといて、アドバイスがほしい
自分のプログラミング経験: 明解C(入門)→プログラミング言語C[B.W.カーニハン/D.M.リッチー]→ポインタ完全制覇[前橋和弥]
現在: 独習C++(今月中に終わる予定) 詳説正規表現、perl(時間があれば)
これから: STLによるC++プログラミング→ Effective C++ → Effective STL → Modern C++ Design →Advanced Windows
皆さんならどれぐらいの期間かかるのだろうか?もしどうしても9ヶ月程度でマスターしたいのであれば日に何時間勉強すればいい?
(この調子だとLispやLinuxに手を出すのは何年後になるのやら・・・)

アバター
h2so5
副管理人
記事: 2212
登録日時: 9年前
住所: 東京
連絡を取る:

Re: C++に関するスケジュール

#2

投稿記事 by h2so5 » 7年前

LispやLinuxを扱うのにC/C++をマスターする必要性はありません。今日にでも初めてみては?

あと読んだ本を「プログラミング経験」というのはちょっと違うと思いますよ。
実際にコードを書くのがプログラミングですから。

ただの屍のようだ

Re: C++に関するスケジュール

#3

投稿記事 by ただの屍のようだ » 7年前

学習に使う教科書の演習問題、一つたりとも飛ばさずに回答し確認するのはプログラミング経験に入らないの?

アバター
h2so5
副管理人
記事: 2212
登録日時: 9年前
住所: 東京
連絡を取る:

Re: C++に関するスケジュール

#4

投稿記事 by h2so5 » 7年前

演習問題もプログラミングのうちだと思いますが、
書名を列挙されても回答する際の参考にはならないですね。

ただの屍のようだ

Re: C++に関するスケジュール

#5

投稿記事 by ただの屍のようだ » 7年前

せっかくだし。トピックを有効利用しよう!
下のプログラム:ファイルの文字列を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
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: C++に関するスケジュール

#6

投稿記事 by softya(ソフト屋) » 7年前

> 皆さんならどれぐらいの期間かかるのだろうか?もしどうしても9ヶ月程度でマスターしたいのであれば日に何時間勉強すればいい?

9ヶ月だと底の浅い知識しか身につかない可能性が高いと思います。
色々苦心惨憺して身につくものです。

あと練習問題やAOJ(会津オンラインジッジ)など小規模のコードをいくら書き連ねても実はある程度規模以上のプログラムを組めるようになりません。
つまり、実用的なアプリやゲームを組める実力が身につかいないのです。
ズバリ!それを身につける方法は失敗を繰り返しても良いので、ある程度規模以上のアプリやゲームを理解したい機能を駆使して苦労して組むことです。

それと問題のコードですが、書かないうちに読むのは動作未定義じゃないかと思うわけです(調べてないので断言はできません)。
なので動いたり動かったなかったりで、処理系に依存したりすると思います。
システムの裏をつくようなコードを書く癖は改めたほうが私は良いと思いますよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ただの屍のようだ

Re: C++に関するスケジュール

#7

投稿記事 by ただの屍のようだ » 7年前

ふむふむ。まぁ一言で言うと俺はニートだ!!
時間だけはたっぷりとあるからな。
言語の仕様や機能を一通り理解したら、アプリやゲームとか作ろうと思ってるよ。

例のコードだが、実を言うと11行目に tellp() もしくは tellg() が呼び出されていればうまく動作する。
そこで tellp() もしくは tellg() の内部動作について知りたかったんだが・・・

まぁマイペースでやっていくよ

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: C++に関するスケジュール

#8

投稿記事 by softya(ソフト屋) » 7年前

ただの屍のようだ さんが書きました:ふむふむ。まぁ一言で言うと俺はニートだ!!
時間だけはたっぷりとあるからな。
言語の仕様や機能を一通り理解したら、アプリやゲームとか作ろうと思ってるよ。

例のコードだが、実を言うと11行目に tellp() もしくは tellg() が呼び出されていればうまく動作する。
そこで tellp() もしくは tellg() の内部動作について知りたかったんだが・・・

まぁマイペースでやっていくよ
言葉遣いにはご注意いだけると幸いです。
フォーラムルール上、掲示板上の騒動の原因となるため禁止行為とさせていただいています。
http://dixq.net/board/board.html

内部動作に関しては申し上げた通り知らないほうが良いともう一度書かさせて頂きます。
VC++で通用してもgccで通用しない方法に何の意味があるかと考えてもらえば自明かと。

ちなみにstreamはテンプレートですので、ソースコードを見ることはもちろん可能ですでコードを読まれたどうでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2646
登録日時: 9年前
連絡を取る:

Re: C++に関するスケジュール

#9

投稿記事 by ISLe » 7年前

読み書きモードで開いたファイルで、読み→書き、あるいは、書き→読みを切り替えるときは、シーク操作を挟む必要があります。
代わりに
fio.seekp(0,ios::cur);
を入れてみてください。

これは仕様です。
C言語の標準ライブラリでも同様です。

ただの屍のようだ

Re: C++に関するスケジュール

#10

投稿記事 by ただの屍のようだ » 7年前

ほうほう、丁寧語ね
今後気をつけますよ

なるほど、シーク操作かぁ。盲点でした。

ISLe
記事: 2646
登録日時: 9年前
連絡を取る:

Re: C++に関するスケジュール

#11

投稿記事 by ISLe » 7年前

VC++2012で試すとまともに動かない(というか止まらない)のですけど、規格的に正しいコードなんでしょうか。
charとEOFを比較している時点で怪しいですけど。

ただの屍のようだ

Re: C++に関するスケジュール

#12

投稿記事 by ただの屍のようだ » 7年前

自分が覚えている限り、Cの仕様では半角文字は0~255
そしてEOFはどの文字にもなりえない-1のはずです。
そこでchar変数に-1を代入して整数として表示させてみてください。

*すくなくとも自分の環境では普通に動いてますよ

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: C++に関するスケジュール

#13

投稿記事 by softya(ソフト屋) » 7年前

ただの屍のようだ さんが書きました:自分が覚えている限り、Cの仕様では半角文字は0~255
そしてEOFはどの文字にもなりえない-1のはずです。
そこでchar変数に-1を代入して整数として表示させてみてください。

*すくなくとも自分の環境では普通に動いてますよ
それではcharに255を代入して表示させてみてください。

あと環境限定は、あとあと困ることになりますよ。
※ 事実上Windows標準のVS2012で動かないのはマズイのでは?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

YuO
記事: 941
登録日時: 9年前
住所: 東京都世田谷区

Re: C++に関するスケジュール

#14

投稿記事 by YuO » 7年前

ISLe さんが書きました:VC++2012で試すとまともに動かない(というか止まらない)のですけど、規格的に正しいコードなんでしょうか。
charとEOFを比較している時点で怪しいですけど。
規格的には未規定の振る舞いかなぁ,と。
INCITS/ISO/IEC 14882:2011 27.7.2.3 Unformatted input functions ¶6には,

コード:

basic_istream<charT,traits>& get(char_type& c);
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にEOFを代入するとは書いてありません。
ただの屍のようだ さんが書きました:自分が覚えている限り、Cの仕様では半角文字は0~255
そしてEOFはどの文字にもなりえない-1のはずです。
要出典。
仕様を語るなら規格のどこにあるのかを示せるはずです。
私の知る限り,ISO/IEC 9899に「半角文字」に相当する単語は出てこなかったはず。
オフトピック
PDFでhalfwidthを検索すると見つからず,halfは
  • half-strip
    • cacosh
  • half-plane
    • csqrt
    • G.6の複素関数での説明
  • halfway
    • round
    • lround, llround
が見つかるのみ。
さらに,EOFはint型の負の値で,ストリームに出てこない値,というだけと読めますが (ISO/IEC 9899:1999 7.19 input/output <stdio.h> / 7.19.1 Introduction ¶3)。
ただの屍のようだ さんが書きました:そこでchar変数に-1を代入して整数として表示させてみてください。
char型が符号付きか符号無しかはimplementation-definedです (ISO/IEC 9899:1999 6.2.5 Types ¶15)。

コード:

printf("%i", (int)(char)-1);
が-1になるのかそうでない正の値になるのかは,実装に依存します。
実装に依存する結果だけから仕様を推測するのは危険ですよ。
オフトピック
ついでにいえば,CHAR_BITが8とは決まっていないし,SCHAR_MAXが127だとも,UCHAR_MAXが255だとも決まっていない。
さらに,負数の表現に2の補数を使うことも決まっていない。

ただの屍のようだ

Re: C++に関するスケジュール

#15

投稿記事 by ただの屍のようだ » 7年前

そうですね。intでいいと思います。
それはそうと、intがcharに変わったところで自分のコードが無限ループするとは思いません。
理由:たとえEOFがうまく返されなかったとしても、ファイルの終わりに達していればwhile文から抜け出せます。
(ループの判定はあくまで!fio.eof()ですので)

ほんとうに自分のコードそのままコピーしただけで、無限ループに陥ったのでしょうか
もし、そうでしたら。こちらではどうやっても無限ループにならないので力にはなれませんが原因究明お願いします。

ISLe
記事: 2646
登録日時: 9年前
連絡を取る:

Re: C++に関するスケジュール

#16

投稿記事 by ISLe » 7年前

ただの屍のようだ さんが書きました:(ループの判定はあくまで!fio.eof()ですので)
eofはファイル終端に達したときじゃなくて、ファイル終端でさらに読み込んだときに立つフラグです。
よくある勘違いですが。
なので1文字目を読み込んだ後にチェックしてないこともおかしいのですよ。

Cygwin版g++で試すと期待通り(?)に動きました。
こちらは書き出し操作でeofフラグが変化するみたいですが規定されていない動作なので保証されません。
VC++では書き出し操作でeofフラグがリセットされて無限ループになるようです。

コードとしてはどこもかしこもまともじゃないです。


このようなコードが本に載っていたのでしょうか。
もし外の世界でも通用するコードを書きたいなら、その本はいますぐ捨てたほうが良いと思います。

ISLe
記事: 2646
登録日時: 9年前
連絡を取る:

Re: C++に関するスケジュール

#17

投稿記事 by ISLe » 7年前

ただの屍のようだ さんが書きました:自分が覚えている限り、Cの仕様では半角文字は0~255
そしてEOFはどの文字にもなりえない-1のはずです。
そこでchar変数に-1を代入して整数として表示させてみてください。
それだとchar型の値とEOFを比較したら等しくなることはあり得ないですよね。
EOFをchar型の変数に代入したらcharで表現できる値に丸められてしまいますからね。
比較自体が無意味ですよね。

ただの屍のようだ

Re: C++に関するスケジュール

#18

投稿記事 by ただの屍のようだ » 7年前

ふむふむ。やはり、熟練者は頼りになりますね。
ところでだ、本は初心者向けの良書と思いますよ。
実際、fstream.eof()のみでEOFチェックしてますし、もちろん一回目の読み込み直後にもチェック文が入っています。

そう、自分がeof関数を勘違いしたので、一回目のチェック文が無意味に見えただけです。
ついでにいうと、stream.get(char&) = int getc(FILE*)と思ってました。
今後はあせらずに関数の仕様しっかり見るよう気をつけますよ。
(デフォルトでsigned charなら-1は範囲内ですよ。あと自分から本取り除いたらなにも残らないじゃないですかぁ、やだぁ)

ISLe
記事: 2646
登録日時: 9年前
連絡を取る:

Re: C++に関するスケジュール

#19

投稿記事 by ISLe » 7年前

ただの屍のようだ さんが書きました:(デフォルトでsigned charなら-1は範囲内ですよ。あと自分から本取り除いたらなにも残らないじゃないですかぁ、やだぁ)
既にYuOさんが書かれてますが、C/C++言語としてはcharのデフォルトはsigned charでもunsigned charでもどちらでもかまわないことになっています。
unsigned charの場合に正常に動かないのはC/C++言語として不適格なコードということになります。
つまり期待通り動くのは偶然です。

閉鎖

“C言語何でも質問掲示板” へ戻る