- 1 名前:デフォルトの名無しさん [2007/06/25(月) 12:01:46 ]
- エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.38【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1180877635/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
- 2 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 12:04:06 ]
- >>1乙
- 3 名前:ちんこ [2007/06/25(月) 12:33:43 ]
- 乙
- 4 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 12:36:12 ]
- チン腰ね
- 5 名前:デフォルトの名無しさん [2007/06/25(月) 13:26:07 ]
- / / / ヽ ヽ
/^ 7 / // i /| .ト、 !ハ . ,′// }. |ハト、{ヽ! ヽ! ヽト/ハ ! ! 三 | / / | ハ ,=、 =、 ☆ | | _| / ミ /ノ,, ,, ___ ,, | ! j| \ /三L」 ミ / 二コ、ヽ . _ .ノ ,イ / . ′ X/ .| | ミ / xく | > ┬ イリ. / / // \ | |__ / .!斗―/.! / ./ /__{ .{_ __ / ̄ヽj 从| トイヽ_/{ { ∧  ̄_ {___人 / /` .。ノ ___ \ //∨ } \< / ′ ※亠‐┐ 〉 //ミ ノ_人 \{ { j!| }|/!
- 6 名前:デフォルトの名無しさん [2007/06/25(月) 15:08:41 ]
- C言語 XP Borland C++ Compiler 5.5
ファイルから別のファイルに内容をコピーする場合 コピー元のファイルを開いて中身を配列に格納してコピー元のファイルを閉じ、 コピー先をファイルを開いて配列に格納した内容をコピー先に送ってコピー先のファイルを閉じる ってやり方でOKでしょうか? それともコピー元とコピー先のファイルを一緒に開いて直接コピーする事は可能ですか?
- 7 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 15:11:17 ]
- 同時にオープンしてても大丈夫
- 8 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 15:25:43 ]
- >>6
と言うかメモリに収まりきらない巨大なファイルをコピーする場合は 同時にオープンするしかないでしょ。 seekg()とかでちょっとずつコピーする事もできるけど現実的じゃないし。
- 9 名前:デフォルトの名無しさん [2007/06/25(月) 15:28:02 ]
- 有難うございます
同時にファイルを開く場合、書き方としてはこれで大丈夫でしょうか? FILE *fp1,*fp2; char ch; if((fp1 = fopen(argv[1],"r")) == NULL){ printf("ファイルを開くことが出来ません\n"); exit(1); } if((fp2 = fopen(argv[2],"a")) == NULL){ printf("ファイルを開くことが出来ません\n"); exit(1); } while((ch = fgetc(fp1)) != EOF){ fputc(ch,fp2);
- 10 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 15:35:53 ]
- fclose()も忘れずにな
それから"a"で開いてるのはどうして?
- 11 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 15:42:42 ]
- >>9
・引数の数チェック汁 ・fgetc()はgetc()と機能は同じだがfgetc()のほうが速いことはまずない fputc()も同様 まぁどっちもファイルコピーに使うには遅すぎだが ・つかファイルをコピーしたいんならバイナリで開け ・開けなかった時はperror()を使うと処理系定義のエラーメッセージを出してくれる
- 12 名前:デフォルトの名無しさん [2007/06/25(月) 15:46:45 ]
- >>10 w+ に変更しますた
>>11 今日、ファイル入ったばかりでまだバイナリまでいってないんす・・・ でこんな感じで書いてみたのですが、何故かコピー先のファイルから結果が表示されない・・・どちて? int main(int argc,char *argv[]) { FILE *fp1,*fp2; char ch; if(argc != 2){ printf("使用法:<プログラム名> <コピー元ファイル名> <コピー先ファイル名>\n"); exit(1); } if((fp1 = fopen(argv[1],"r")) == NULL){ printf("ファイルを開くことが出来ません\n"); exit(1); } if((fp2 = fopen(argv[2],"w+")) == NULL){ printf("ファイルを開くことが出来ません\n"); exit(1); } while((ch = fgetc(fp1)) != EOF) if(fputc(ch,fp2) == EOF){ printf("ファイル書き込みエラー\n"); exit(1); } fclose(fp1); while((ch = fgetc(fp2)) != EOF) putchar(ch); fclose(fp2); return 0; }
- 13 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 15:49:49 ]
- - if(argc != 2){
+ if (argc != 3) { それと while((ch = fgetc(fp2)) != EOF) putchar(ch); の前に rewind(fp2); 入れろ
- 14 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 15:52:27 ]
- >>13
できました ありがとうごぜいます
- 15 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 16:12:16 ]
- windows、C++Builderです。
バックアップソフトを作りたいと思ってます。 フォルダの中身を、違うパーティションにコピーするだけです。 ’曜日’と’時間’だけ、タイムテーブルのようなものに 記録しておいて、時間が来たらコピーする。ということを 永久に繰り返します。 月曜日は、5:00と13:00と18時 火曜日は、5:00 水曜日は、3:00 ・・・ など、曜日によって回数も様々です。 どういう仕組みを使うのが、良いでしょうか? time_t current; time(¤t); で、1秒ごとに時刻を取得して比較してたら 大変ですよね。
- 16 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 16:14:42 ]
- 基本的にはタイマー設定すると思うけど。
- 17 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 16:17:10 ]
- >>15
1.次のバックアップまでの時間に応じてチェックする間隔を変更する(時間に応じて2時間、30分、5分、1分のように) 2.Windows付属のスケジューラを使う 3.多少の誤差は気にせず指定時間までSleep
- 18 名前:デフォルトの名無しさん [2007/06/25(月) 16:27:43 ]
- RHEL3環境で、gcc(ver 2.95.3であると思われます)
c++でcursesを使ったプログラミングをしているのですが、 string str[2] str[0] = "hoge0"; str[1] = "hoge1"; str[2] = "hoge2"; for(int i=0; i<3; ++i){ printf("%s\n",str[i]); refresh(); sleep(1); } のように行うことで出力したいのですがうまくコンパイルできません。 stirng型を出力する方法はないでしょうか? 教えてください。
- 19 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 16:31:49 ]
- >>18
つ str[i].c_str() つか、君の読んでる本には載ってないのか?
- 20 名前:デフォルトの名無しさん [2007/06/25(月) 16:32:52 ]
- >>18です。
追記です。 出力に●や彡を出力したいので、charではうまくいかず、 stringを使っています。 %sがchar*だからstringの出力ができないと思うのですが、 %sの代わりの変換指定子が分かりません。 お願いします。
- 21 名前:デフォルトの名無しさん [2007/06/25(月) 16:34:39 ]
- >>18です。
>>19さんの書き込み見る前に>>20を書き込んでしまいました。 今試して見ます。 ありがとうございます。
- 22 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 16:35:08 ]
- >>18
- string str[2] + string str[3]; >>20 >>19を嫁 c_str()はconst char*を返すから%sでいい
- 23 名前:デフォルトの名無しさん [2007/06/25(月) 16:38:53 ]
- 文字列の表示に変換指定子の「%s」を使っての
ひらがな、カタカナ、漢字などの全角文字の表示に問題なかったのですが 実際は半角英数字以外使ってはいけないとかあるのでしょうか? 初心者向けの書籍だとみな半角の英語を使って説明されているので 全角文字でも問題がないのかどうか判断に困っています。
- 24 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 16:42:18 ]
- >>23
ためせ
- 25 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 17:01:14 ]
- 試してOKだったけど、どうなの?って話だろうに。
>>23 char* なら、ASCII だろうと多バイト文字列だろうと問題ナス。
- 26 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 17:02:42 ]
- >>12
その場合 char ch; は間違い。 int ch; にすべし。
- 27 名前:24 mailto:sage [2007/06/25(月) 17:03:40 ]
- ああ、「問題なかった」と言ってるんだから「試せ」も糞も無いな
ごめん 実際には ・その特定のエンコーディングのソースをコンパイラが処理できるか ・実際に表示(端末に出力)した際に、その特定のエンコーディングの文字列を 端末が表示できるか といった問題が関係してくる まあ日本語に対応したOSや端末で、日本語に対応したコンパイラを使っている 分には通常問題が無いが、 例えばEUC-JPやISO-2022-JPやUTF-8なソースをVC++は食えない 最近のgccは-finput-charsetだの-fexec-charsetだのを適切に指定することで 多国語に対応する
- 28 名前:デフォルトの名無しさん [2007/06/25(月) 17:07:16 ]
- >>18です。
>>19さん のように行ったらできました。ありがとうございました。 私の使っている、「やさしいC++」にはc_str()は載ってませんでした。 これが分かった上でもうひとつお聞きしたいのですが、 string str[2]; str[0] = "hoge0"; str[1] = "hoge1"; str[2] = "hoge2"; char* s[2]; s[0] = str[0].c_str(); s[1] = str[1].c_str(); s[2] = str[2].c_str(); が行えません。 char*にchar*を入れているのでいけると思ったのですが。 これはなぜでしょうか?
- 29 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 17:08:28 ]
- >>28
>>22で指摘したのに…… 配列str[]のサイズは2ではなく3にしろ
- 30 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 17:10:00 ]
- なんでダメかというと
char*にconst char *はそのままでは代入できないからだ const char *s[3]; とするか(こっちが推奨)、 s[0] = const_cast<char*>(str[0].c_str()); とでも汁(こっちは非推奨)
- 31 名前:デフォルトの名無しさん [2007/06/25(月) 17:11:53 ]
- >>29さん
すみません、これは単純な書きミスでした。 string str[3]; str[0] = "●"; str[1] = "●●"; str[2] = "●●●"; char* s[3]; s[0] = str[0].c_str(); s[1] = str[1].c_str(); s[2] = str[2].c_str(); としてます。
- 32 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 17:16:47 ]
- >>30
非推奨っつーか、やっちゃだめ
- 33 名前:デフォルトの名無しさん [2007/06/25(月) 17:17:48 ]
- >>30さん
ありがとうございます。 やってみたらできました。 みなさんありがとうございました。 # 書き込む前に新しいレスがあるかリロードでチェックしなくてはいけませんね。 # 何か自分が書き込むタイミングが一歩遅いようで。申し訳ないです。
- 34 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 17:18:39 ]
- >>32
char *s = "hello"; と犯罪性は同じだと思うけど。 でもこれは合法だしな未だに。
- 35 名前:23 [2007/06/25(月) 17:20:24 ]
- >>25
>>27 詳しい説明ありがとうございます、 助かるとともに勉強になります。
- 36 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 17:21:18 ]
- >>34
そんな負の遺産も使っちゃダメ。
- 37 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 17:23:44 ]
- >>36
〃〃 _, ,_ ⊂⌒( `Д´) < ヤダヤダ! `ヽ_つ ⊂ノ ジタバタ
- 38 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 17:54:43 ]
- main で catch(...) ってどう思います?
例外がキャッチされなかった場合、 デストラクタが実行されるかどうかは未定義で、 実際 g++ だと実行されなかったりします。 それを考えると、main で catch(...) しといた方が 安全なのかな・・・とか思うのですが。
- 39 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 18:03:13 ]
- #include<stdio.h>
#include<stdlib.h> char *search_r(char *s,char *p){ char *x; int i; x=p; i=sizeof(p); while(1){ p=x; if(*s=='\0')exit(1); while(*s==*p){ if(*s=='\0')exit(1); s++; p++; } if(*p=='\0')break; s++; } return s-(i-1); } int main(){ char *x; x=search_r("konbanhasensei","hasen"); printf("%s",x); return 0; } 文字列pから文字列sを検索するプログラム このプログラムで結果を 「hasensei」と表示したいのですが「sensei」となってしまいます。 どこがおかしいのでしょうか。 よろしくお願いします。
- 40 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 18:08:15 ]
- >>39
マンドクセーからちゃんと読んでないが > i=sizeof(p); sizeof(p)はポインタpのサイズ(4とか)が分かるだけだ。 pが指してる文字列の長さを測りたいのなら、strlen()を使え。
- 41 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 18:08:25 ]
- sizeof(p) → strlen(p)
s-(i-1) → s-i exit(1); が凄い気になるが・・・。 NULL 返したのでいいんじゃないかな。 for 使ってないあたりも読みづらい。
- 42 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 18:11:37 ]
- >>40
>>41 ありがとうございます。
- 43 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 18:19:29 ]
- それ以外にもバグはあるけど、
まあそれは自分で確認してくれ。
- 44 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 21:19:09 ]
- 環境はC++です
今日自分の作ったサブルーティンを上司がチェックしたみたいなんですが この構造体はインパラメータだから値渡しにしろ と言ってきました。 サブルーティンの引数に構造体を渡すときに値渡しって使いますか? このサブルーティンで使っている構造体のサイズは決して小さくはありませんし、 自分的には構造体のサイズが小さくても値渡しは使わないと思っていたので ちょっと衝撃的でした。
- 45 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 21:25:18 ]
- 場合による
- 46 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 21:25:36 ]
- >>44
const参照渡しをしててそう言われたんなら上司を鼻で笑ってやれ constのつかないポインタ渡しでもしてたんなら君も悪い
- 47 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 21:47:18 ]
- つうか値渡しでどうやって受け取るんだ
- 48 名前:47 mailto:sage [2007/06/25(月) 21:48:37 ]
- あぁ読み込みパラメータね
勘違いした ごめんよ
- 49 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 21:56:24 ]
- const ポインタ渡しするのが普通だな。
小さい構造体の場合は別な事もあるけど、 まあ場合によるな。
- 50 名前:44 mailto:sage [2007/06/25(月) 22:21:39 ]
- >>46
上司を鼻で笑ってやったら首になりました。 貰ってやって下さい。
- 51 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 22:24:29 ]
- >>50
早っ!
- 52 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 22:24:49 ]
- >>50
うちに来い。Cだが、ひどいデスマも無い。 残業代は0だけど・・・
- 53 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 22:43:57 ]
- >>16-17
15です。 曜日、時間でのバックアップの件でしたが、 お礼遅れてすみません。sleepで行きます。 ありがとうございました。
- 54 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 23:02:28 ]
- >>49
C++ならconst参照だろ
- 55 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 23:03:36 ]
- あ、C++ だったか。
大きな構造体って時点で C かと思ってしまってた。
- 56 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 23:07:00 ]
- C++です。
struct S { int a; int b; int c; }; という定義の構造体があったとして、 S s = {0}; と書いた場合、b と c が 0 になることは保証されますか?
- 57 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 23:09:31 ]
- されます。
- 58 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 23:16:54 ]
- 8.5.1p7 に書いてあるね。
int() すなわち 0 で初期化される。
- 59 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 23:24:54 ]
- >>57,58
ありがとです。
- 60 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 01:00:48 ]
- C++Builderです。
builderのウィンドウで、タブ(Astandard,Additional,Win32,System,,,) ってありますが、こういうことする場合は、どんな部品を 使用すればよいでしょうか?
- 61 名前:60 mailto:sage [2007/06/26(火) 01:03:49 ]
- タブをクリックしたら、なにか表示させたり、
追加、削除もしたいんです。 よろしくお願いします。
- 62 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 02:34:19 ]
- >>38
あんたの思ってるとおり、しといたほうが安全だよ。 その前に std::exception は別でキャッチしてエラー表示してね。
- 63 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 05:55:44 ]
- 変な状態のままデストラクタが呼ばれたら、
それはそれで危険という気もしなくもない。 どっちがいいのかね?
- 64 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 06:36:20 ]
- 例外と言えば、例外指定って使ってる?
俺は使ってない。
- 65 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 08:37:35 ]
- 正常にインスタンスができたかどうかフラグ持っておけばいいんじゃないか
- 66 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 08:41:34 ]
- まあ、たとえ例外が起きても
メンバ変数が変にならないように気をつけるべきということで、 キャッチされても問題ないように作るべき、なのかな?
- 67 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 08:55:33 ]
- >>63,65,66
www.boost.org/more/generic_exception_safety.html boost.cppll.jp/HEAD/more/generic_exception_safety.html 「まるで例外は、正しいコードに対するミステリアスな攻撃であり、 我々が自らをその攻撃から守らなければいけないようなものであると 見なされているかのようである。 言うまでもなく、これはエラー捕捉との 健全な関係に繋がらない!」
- 68 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 09:00:32 ]
- >>64
boost や標準ライブラリの方針によれば、使わないほうがいいってことになる。 www.boost.org/more/lib_guide.htm#Exception-specification
- 69 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 09:08:14 ]
- 最適化の問題で使わない方がいいという話もあるのか。なるほど。
- 70 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 09:17:40 ]
- 標準ライブラリで std::exception::what だけ例外的に例外指定を持ってるのは、
catch 中で別の例外起こされたら面倒だからかな?
- 71 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 09:23:55 ]
- >>67
確かに健全な関係ではないけど、 無視できないんだよなあ。 例外指定を普通使わない以上、 どの関数がどんな例外を投げるか パッと見分からないことも多いし、 思わぬ例外を投げられたらそれは ミステリアスな攻撃と思われてもしゃーない気がするよ。 全ての関数が例外を投げる可能性があるって感覚で プログラムを組むのがいいのかね。
- 72 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 09:35:26 ]
- >>71
安全側に倒すという意味で、そう思ってかかってもいいだろう。 思わぬ例外を投げられてもきちんと動作するように書くべきだし、 極力そう書くことができるように言語や標準ライブラリが整備されている。
- 73 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 09:36:45 ]
- >>70
標準ライブラリの中でも throw() はいろんな関数についてるよ。 型付で指定してるのはグローバルな operator new () ぐらいかな?
- 74 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 09:44:20 ]
- >>73
あ、そうなんだ。 std::exception::what はオーバーライドすることがあるから 目立つってだけのことか。
- 75 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 09:46:24 ]
- >>72
Joel タンが例外嫌いなのも、そのあたりが気持ち悪いからなんだろうな。 でも、標準ライブラリやキーワードが例外投げる以上、 無視するわけにもいかないと思うんだけどね・・・。
- 76 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 10:26:57 ]
- >>75
あの話は戻り値についてもいっしょだろ。 ただ単に戻り値でのチェックに慣れているから、 戻り値をチェックしていないコードのほうが見つけやすいって話。 例外に慣れてしまえば、例外安全でないコードは同じぐらい 簡単に見つけられる。ただし現状では、↑の理由で他の人に 伝わらないことが多い。 敢えて言い切ってみたけど、ホントのところはちょっと自信が無い。 新しい言語をデザインするなら、 try ブロックじゃなくって nothrow ブロックを作ればいいんじゃないかと思う。 「オレはここでは例外が飛ばないと仮定して書くぜ」っていう ブロックね。
- 77 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 10:31:57 ]
- どうなんかねえ。
例外をうっかり無視するコードより、 戻り値をうっかり無視するコードの方が危険性は高いと 個人的には思うんだけど。
- 78 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 10:35:19 ]
- つーかC++の例外が糞で使いにくいだけ
- 79 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 10:35:24 ]
- 例外は「うっかり無視」できないのがいいんだよ。
- 80 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 10:43:09 ]
- そうそう。
- 81 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 11:55:16 ]
- 例外は戻り値と違って発生源や内容の概要が簡単に特定できるから
エラー→復旧っていう処理に使いやすい エラーしたら即一連の処理を中断するだけなら戻り値でもいいけど エラー内容によってstrategyパターンを使って処理を色々と変えるなら 例外の方がやりやすい と思ったんだけどどうかな? 軽く試してみてちょっと良いかもって思っただけで使い続けられるとは限らないけど
- 82 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 14:05:12 ]
- std::fstream のコンストラクタに渡すファイル(パス)文字列って、
ネイティブなフォーマットのものなの?それとも POSIX 準拠じゃなきゃいけない?たとえば UNIX では /home/hoge/test.txt で Windows では C:\home\hoge\test.txt ? どういうフォーマットのパス文字列を取りうるかに関する 規約って定められてるの??
- 83 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 14:39:34 ]
- POSIX かんけーねー。
処理系で好きに決めりゃいいべさ。
- 84 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 14:48:09 ]
- そうか・・・標準の C++ のライブラリではそこまでは
決められていないんだね。 boost::filesystem では native/ portable が厳密に切り分けられていたので、 fopen や fstream でもそうなってるのかと思った。
- 85 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 14:51:43 ]
- >>82
const char*なのが困り物 たとえばVC++8.0ではlocale依存の方法でUTF-16に変換する それ以前ではコードページ依存の方法でUTF-16に変換する いずれにせよ、NTFSのUTF-16なパスを正しく扱えるとは言いがたい UTF-16なパス名をちゃんと扱いたければ、fstreamを捨てて カスタムのストリームバッファを作れという話になるだろう
- 86 名前:デフォルトの名無しさん [2007/06/26(火) 21:17:53 ]
- ofstreamやifstreamでファイルを開くとき、
ios::binary指定というのは、意味があるのでしょうか? コンパイラはg++です。 いままでとくに指定してもしなくても結果は同じになりました。
- 87 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 21:23:21 ]
- >>86
UNIX系は関係ない。 WIndowsはstd::endlや\nを書き込むと0x0d0x0aになって書き込まれ 読むときは0x0d0aが0x0aになる。
- 88 名前:デフォルトの名無しさん [2007/06/26(火) 21:26:02 ]
- ios::binaryしない奴は死ねっていつも思う。
- 89 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 21:27:15 ]
- >>86
テキストファイルを特別扱いする(というよりC++としては特別扱いしなければならない)環境も結構ある 有名どころではDOS/Windows系のテキストファイルでは改行コードがCR+LFになっていることが挙げられる そういう環境では、テキストファイル特有の処理を行わせたくないときに、バイナリモードを指定する必要がある 逆にUnix関係では大抵違いがないが、移植性向上のために必要に応じバイナリモードを意識的に使うのは良いことだ Unixとかでもワイド文字ストリームなら、文字コード変換をどうするかで テキストモードとバイナリモードの違いが表れるはず
- 90 名前:デフォルトの名無しさん [2007/06/26(火) 23:37:20 ]
- while(!feof(fp1)){
ch = fgetc(fp1) if(!feof(fp1) fputc(ch,temp); } ファイルの中身を別のファイルにコピーする場合の例題に書かれていたコードなんですが whileの式で(!feof(fp1))と記述されているにもかかわらず何故さらにif(!feof(fp1)と書いているのは何故なんでしょうか? 何か意味があるんですか? whileの式でファイルの末端にきたらループ終了なのでifの式は必要ないように思えるんですが
- 91 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 23:44:12 ]
- >>90
意味以前にその例題、コンパイルできるか?
- 92 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 23:45:19 ]
- >>90
fgetc()で読みに行ってみないとEOFだとわからんことがあるから。 その場合、whileの条件式の時点ではEOFではないと判断して 読みに行ってみたらEOFだった(読めませんでした)というカタチになるので 下のチェックが要る。 だがこんなのは糞コード。 while ((ch = getc(fp)) != EOF) putc(ch, temp); とするがよい。
- 93 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:12:20 ]
- >>92
バイナリファイルを操作する場合は>>90の方がよい
- 94 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:13:20 ]
- >>93
なぜ?
- 95 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:16:51 ]
- >>94
int型と比較した時、EOFと同じ値のバイトが存在する可能性があるから
- 96 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:17:02 ]
- とても初歩的な質問ですが
short i; long k; float f; double d; としたときに @ (f+15)/(long)(d-15) A k+20.0 B (int)d/i の型(double,longなど…)はどうなるでしょうか? こういう場合は計算式の中でもっとも高精度な変数の型になると理解すればいいのでしょうか?
- 97 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:17:55 ]
- >>95
あ、chがcharだと仮定しているわけね。 それならば、単にint chと宣言して>>92のコードで良い。
- 98 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:21:04 ]
- >>96
整数拡張、型の昇格
- 99 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:23:00 ]
- というかgetc()の戻り値をcharで受け取る奴がアホ
- 100 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 02:13:04 ]
- C++でのバイナリファイルの読み書きは、ifstreamのreadとか、ofstreamのwriteを使うんですよね。
気になったのは、どちらも char * を指定するところです。freadは void * だったと思うんですが。。。 ifs.read(reinterpret_cast<char *>(&hoge), sizeof(unsigned)); という感じで、毎回キャストしないといけないんですか?
- 101 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 02:27:57 ]
- >>100
残念ながらキャストが必要。 毎回キャストするのが嫌なら、適当な関数で包め。
|

|