C++相談室 part48

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2006/04/21(金) 10:10:12
*str.rbegin()
str[str.size() - 1]
*(str.begin() + str.size() - 1)
*(--str.end())
953デフォルトの名無しさん:2006/04/21(金) 11:28:20
954デフォルトの名無しさん:2006/04/21(金) 13:06:18
>>938
えっ!?
955デフォルトの名無しさん:2006/04/21(金) 13:07:07
そろそろ次スレ。
テンプレにある cuj のリンクどうする?
956デフォルトの名無しさん:2006/04/21(金) 16:18:45
>>953
>OK, we all know std::basic_string is bloated and already has way too many members.
書き出しがこれかよwww
957デフォルトの名無しさん:2006/04/21(金) 17:50:02
C++98→C++03の変更は細かい修正だけと聞いていますが、
その差分だけまとめた文書はないでしょうか?
双方もっているのですが、自分で調べるのは大変なので。
958デフォルトの名無しさん:2006/04/21(金) 23:13:36
http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html

のページで "Status: TC" という語で検索する
959957:2006/04/22(土) 09:01:55
ありがトン
960デフォルトの名無しさん:2006/04/23(日) 12:10:55
あふぉぢゃねーの
961デフォルトの名無しさん:2006/04/25(火) 14:09:13
fread(3)とかの3って引数の数?manの3?
どっちが一般的?
962デフォルトの名無しさん:2006/04/25(火) 14:19:00
manの3。ライブラリだぜということ。UNIX以外では意味ない。
引数の数で使うことはない。
それからスレ違い。
963デフォルトの名無しさん:2006/04/25(火) 16:47:17
std::vectorやstd::map等のコンテナについてなんですが
begin(), end()や、イテレータの代入・インクリメント・デクリメント等の操作で
例外がthrowされる可能性はあるんでしょうか?
964デフォルトの名無しさん:2006/04/25(火) 16:51:43
begin() end() それぞれの operator についてソースを読めば?
965デフォルトの名無しさん:2006/04/25(火) 16:53:00
いや、実装依存の話じゃなく規格で定められているのかなと。
966デフォルトの名無しさん:2006/04/25(火) 17:54:09
それこそ規格書読めばという話になるが
967デフォルトの名無しさん:2006/04/25(火) 18:33:34
>>963
禿本Special Editionの付録Eを読んで。
今手元にないからアレだけど。
968デフォルトの名無しさん:2006/04/25(火) 18:55:46
規格書持ってないんで
ttp://www.kuzbass.ru/docs/isocpp/
ここで調べたけど書いてないみたい。
969デフォルトの名無しさん:2006/04/25(火) 19:03:13
強い保証と非送出保証が書かれてないものは規格的に未定義。
970デフォルトの名無しさん:2006/04/27(木) 14:44:11
ifstreamでテキストファイルを読み込む場合なんですが、
一度目は問題なく読み込めるんですが、
同じ作業中にもう一度同じファイルを読み込もうとした場合、
ちゃんと読み込めないことがあるんですが、どうなってるんでしょう?
971デフォルトの名無しさん:2006/04/27(木) 15:01:46
「ちゃんと読み込めない」を具体的に
972デフォルトの名無しさん:2006/04/27(木) 15:10:50
foo970(char *filename) {
  ifstream file1(filename);
   :
   :
  //←なぜかクローズしてない
  ifstream file2(filename);
  readline(line); // ちゃんと読み込めない
}
973970:2006/04/27(木) 15:10:56
ファイルのオープンはできてるんですが、
文字をどうも文字化けを起こした状態で読み込んでしまっているようです。
必ず起こるわけではなく、時折繰り返しているうちに起こります。
974970:2006/04/27(木) 15:12:57
クローズはきちんと行ってます。
975デフォルトの名無しさん:2006/04/27(木) 15:13:50
最初に開いたファイルに書き込みとかしてるの?
976970:2006/04/27(木) 15:14:12
書き込みはしてません。読み込むだけです。
977デフォルトの名無しさん:2006/04/27(木) 15:16:28
読めないファイルとコードを晒してくれたほうが早いな
978デフォルトの名無しさん:2006/04/27(木) 15:18:22
とりあえず、open出来たかどうかとか、読み込み成功したかとかは
is_open(), good()とかで確認してる?
979970:2006/04/27(木) 15:19:17
丸コピでスマソ。
fi.open(fileChar, ios::in | ios::binary);
if (fi){
while(charaNum < 100){
charaNum++;
fi.seekg(1, ios::cur);
}
fi.seekg(0, ios::beg);

while(!fi.eof()) //ファイルの最後にきたら終了
{
sprintf(cha2, "%s", cha1);
fi.read(cha1, 1);
sprintf(chan, "%s%s", cha2, cha1);
if (strcmp(chan, "le") == 0){//改行
strs.erase(strs.end() - 1);
strvec.push_back(new string(strs, 0, strs.size()));
strs = "";
fi.seekg(2, ios::cur);
}else{
strs.append(cha1);//文字を保存
}
}
fi.getline(chars, 255);
strvec.push_back(new string(chars));
}
fi.close();
980デフォルトの名無しさん:2006/04/27(木) 15:23:39
つバッファオーバーフロー
981デフォルトの名無しさん:2006/04/27(木) 15:31:04
初期化してないcha1の使いまわしでcha2が溢れてるだけじゃねーの?
982970:2006/04/27(木) 15:32:19
再度読み込む際は、これのあるオブジェクトごとdeleteしてるので、
バッファオーバーフローは無いと思うんですが。
一応格納する文字列のサイズは読み込む際は毎回0になってます。
983970:2006/04/27(木) 15:33:19
sprintf(cha1, "");
sprintf(cha2, "");
で一応初期化はしてます。
984デフォルトの名無しさん:2006/04/27(木) 15:33:33
chaではじまる変数の宣言と読み込もうとしたファイルのサイズも晒せ
985970:2006/04/27(木) 15:37:15
vector<string*> strvec;//ファイル内容行ごとに格納
string strs;//一行読み込み
int charaNum;//文字数
char cha;
char cha1[2];
char cha2[2];
char chan[4];
char fileChar[100];
ifstream fi;//ファイル入力
ファイルサイズは34.6kb〜65.9kbです。
986デフォルトの名無しさん:2006/04/27(木) 15:48:50
sprintf(cha1, "");がまずい

最初の一バイト目だけ'\0'で初期化されるけど、ニバイト目にはゴミが入ってる可能性がある。
fi.read(cha1, 1); で一バイト目に文字を入れたのはいいけど、ニバイト目に運良く'\0'が入っていれば次の
sprintf(chan, "%s%s", cha2, cha1); で期待通りの動作になる。

でも、ニバイト目に'\0'じゃないなにか ('A'とか)がはいってると
sprintf(chan, "%s%s", cha2, cha1); で readで読んだ一文字目 + 'A' + '\0'が現れるまで延々と続く
ゴミ文字列がchanにコピーされる

chanのサイズが4バイト分しかないんで、3文字+'\0'を越える長さの文字列を入れると悲しいことが起こる。

readした直後に cha1[1] = '\0';とかやっとけば問題ない

二文字目にたまたま何が入ってるかは、おまいのプログラムのつくりによるんだが
一回目は'\0'が入ってて、二回目以降は違うものが入ってるんだと思う
987970:2006/04/27(木) 16:09:04
ありがとうございました。
おかげ様で上手く行きそうです。
助かりました。
こんな落とし穴があったとは。
988デフォルトの名無しさん:2006/04/27(木) 17:57:09
std::ifstreamやofstreamなどのファイルストリームが
デストラクタで自動的にcloseされるようになっていない
のには何か理由があるのですか?
989デフォルトの名無しさん:2006/04/27(木) 20:24:00
>>988
デストラクタでcloseされるよ。
990デフォルトの名無しさん:2006/04/28(金) 01:13:15
>>970
最後まで読んでstd::ios::eofbitとかstd::ios::failbitが立ってしまってんだろ。

C++のファイルストリームは、Cとは違い、一度これらのフラグが立ったら、
自動ではクリアされない。そして、クリアしないと入出力が停止される。

clear()汁。
991デフォルトの名無しさん:2006/04/28(金) 07:47:59
俺の股間もよく failbit がたってしまいます。
clear() しても今度はすぐにストリームが空になって
eofbit たってしまいます。


992デフォルトの名無しさん:2006/04/28(金) 08:29:50
これだからスパゲティちんこは・・・
993デフォルトの名無しさん:2006/04/28(金) 08:32:04
>>991 は熱しやすく冷めやすい
994デフォルトの名無しさん:2006/04/28(金) 09:40:36
openできなくなるよりマシ
995デフォルトの名無しさん:2006/04/28(金) 09:45:58
(脳内)彼女のソケットも open できません。
996デフォルトの名無しさん:2006/04/28(金) 09:53:44
C++相談室 part49
http://pc8.2ch.net/test/read.cgi/tech/1146185570/

立てたから後頼む。俺ちょっと出かけるんで。すまん。
997デフォルトの名無しさん:2006/04/28(金) 10:04:30
STLつかうと一気に実行ファイルサイズが10倍に?!
998デフォルトの名無しさん:2006/04/28(金) 11:17:47
>>997
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
999デフォルトの名無しさん:2006/04/28(金) 11:20:19
すげえ!うむごくろう
1000デフォルトの名無しさん:2006/04/28(金) 11:24:39
1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。