1 名前:名無し募集中。。。 [05/01/15 02:18:37] UNIXおよびUNIX clone環境一般のプログラミングに関する質問スレッド 前スレ Part4 pc5.2ch.net/test/read.cgi/tech/1095843584/ Part3 pc5.2ch.net/test/read.cgi/tech/1085930894/ Part2 pc5.2ch.net/test/read.cgi/tech/1055110889/ Part1 pc2.2ch.net/tech/kako/992/992057422.html Part3のミラー makimo.to/2ch/pc5_tech/1085/1085930894.html Part2のミラー makimo.to/2ch/pc5_tech/1055/1055110889.html 関連スレ Cygwin使っている人いますか? その13 (UNIX板) pc5.2ch.net/test/read.cgi/unix/1099157755/ Cygwin使っている人いますか? 3 (Windows板) pc5.2ch.net/test/read.cgi/win/1090131123/ 関連板 pc5.2ch.net/unix/ pc5.2ch.net/linux/
610 名前:デフォルトの名無しさん [05/03/20 02:47:45 ] 標準C言語スレで聞いたら怒られたのでこちらで質問させてください。 mmapの動作に関する質問です。 //#include *は省略 #define SIZE 536870912 int main() { void *map; int fd = open("tmp_file", O_RDWR); size_t size = (SIZE / getpagesize() + 1) * getpagesize(); map = mmap(0, size, PROT_READ | PROT_WRITE, MAP_FIXED, fd, 0); munmap(map, SIZE); return 0; } というプログラムを動かすとバスエラーになってしまいます。 また、変数sizeを使わずにSIZEを使うとセグメントエラーになります。 mmapはファイルをメモリに全部読み込まずに必要な分だけキャッシュする とmanに書いてあるように読めたのですが、間違いでしょうか。 環境はFreeBSD 5.3R, gcc 3.4.2です。メモリは512MBです。
611 名前:デフォルトの名無しさん mailto:sage [05/03/20 03:15:56 ] 商用UNIXだったら分かるんだけどなー。
612 名前:デフォルトの名無しさん mailto:sage [05/03/20 03:45:13 ] >>610 mmapに渡してるsizeとmunmapに渡してるSIZEは同じなのか? つーかちゃんとエラーチェックしろよ。 とりあえずstraceでもしてみれば?
613 名前:デフォルトの名無しさん mailto:sage [05/03/20 04:06:01 ] >>610 > #define SIZE 536870912 これって二進で100000000000000000000000000000、30bitじゃん。 幾らなんでもでかいだろ。 そのカーネルはユーザ空間どれくらいとれるの? 詳しいところ調べるの無理だったら、UNIX板のFreeBSD質問スレが良いかも。
614 名前:デフォルトの名無しさん mailto:sage [05/03/20 06:18:36 ] 問題は>>613 や>>612 が指摘している点もあるが、それ以前に、 第一引数が 0 なのに MAP_FIXED を指定している点もある。 0番値から連続で512MBも置き換えたら、現在実行している プログラムからなにから全部置き換えになるから、そりゃ コアダンプもするだろ。 それから、flags には、必ず MAP_PRIVATE か MAP_SHARED のどらかか片方は指定するようにしろ。 あと、>>612 が言うように、システムコールがエラーで返って ないか調べて、エラーだったら perror() なりerr() する習慣 をつけろ。基本中の基本。 これだけ短いプログラムに、なんでこんなにたくさんバグを 入れられるのかが謎だ。もっと人の書いたちゃんとしたプログラム を読んで真似する習慣をつけるべき。
615 名前:デフォルトの名無しさん mailto:sage [05/03/20 06:57:39 ] どっかのクズサンプルをつかまされたのだろうきっと
616 名前:デフォルトの名無しさん mailto:sage [05/03/20 10:47:37 ] バグと言っていいかどうか微妙だなw
617 名前:610 mailto:sage [05/03/20 11:46:33 ] >>612 あ、SIZEはtypoです。実際は両方ともsizeを指定してます。 あと、エラーチェックもperrorを実際は入れてます。 長くなると迷惑かと思って省略してしまいました、ごめんなさい。 >>613 その辺をうまくよきに計らってくれるのがmmapだと認識してたのですが・・・ 間違いでしたか。 >>614 flagsにMAP_PRIVATEを入れたら行けました。 何か勘違いしてるみたいなのでもちっとじっくりmanを読んでみます。 ありがとうございました。
618 名前:デフォルトの名無しさん [05/03/20 12:35:43 ] 仮想メモリ空間が足りないのに良きに計らうもクソも無いだろ
619 名前:デフォルトの名無しさん mailto:sage [05/03/20 13:37:38 ] >>613 >>610 ではないだが > 30bitじゃん。 > 幾らなんでもでかいだろ。 なんで? ふつうに, mmap(0, 1024L*1024L*1024L, ...) って, 使えてるが. FreeBSD でも Solaris でも IRIX でも... CPU アーキテクチャにもよるだろうけど, 32bit あれば 2G のユーザ空間確保できるのが普通じゃねぇの.
620 名前:デフォルトの名無しさん mailto:sage [05/03/20 13:42:05 ] >>619 > CPU アーキテクチャにもよるだろうけど, 32bit あれば > 2G のユーザ空間確保できるのが普通じゃねぇの. なことはない。
621 名前:デフォルトの名無しさん mailto:sage [05/03/20 13:47:05 ] >>620 > なことはない。 だから, なぜだか教えてほしいって言ってるじゃん. backing store に指定容量以上ののファイルとか, 十分な量の swap 持ってきてもだめなの?
622 名前:デフォルトの名無しさん mailto:sage [05/03/20 13:55:44 ] よくあるケースは、 ・32bitアドレス空間を、半分カーネル空間 ・ユーザ空間の半分をテキスト領域 ・残りをスタック領域とデータ領域 ・sparseであることを仮定したmmap設計 などなど x86はセグメントありますから、32bit全部データ領域は可能。
623 名前:デフォルトの名無しさん [05/03/20 14:02:45 ] UNIX userはやたらとalphabetで書きたがるね。
624 名前:デフォルトの名無しさん [05/03/20 14:04:35 ] それが UNIXer quality
625 名前:621 mailto:sage [05/03/20 14:08:40 ] >>622 > よくあるケースは、 > ・32bitアドレス空間を、半分カーネル空間 mips あたりだと CPU が, そうゆう設計ですよね. > ・ユーザ空間の半分をテキスト領域 こんなのって本当にある? バイナリの仕様次第か? FreeBSD とか, 昔の SunOS-4 なんかだと 2^32/2 - text+maxdsiz+maxssiz が, mmap で使用可能な空間ですよね? > ・sparseであることを仮定したmmap設計 > などなど 64bit ならまだしも 32bit でやるかなぁ??? > x86はセグメントありますから、32bit全部データ領域は可能。 トロくなりませんか, OS が?
626 名前:621 mailto:sage [05/03/20 14:11:15 ] > mmap で使用可能な空間ですよね? ごめんなさい, mmap(NULL, ..., /*MAP_FIXED ではない*/) の話.
627 名前:デフォルトの名無しさん [05/03/20 15:58:01 ] そもそもmmap自体がポータブルじゃないので 良きに計らえとか言ってると火傷します
628 名前:デフォルトの名無しさん mailto:sage [05/03/20 16:38:42 ] Windows使うのが安全。
629 名前:デフォルトの名無しさん mailto:sage [05/03/20 17:10:23 ] 同意。 わざわざ面倒なことする必要もない。
630 名前:デフォルトの名無しさん mailto:sage [05/03/20 17:13:25 ] FreeBSD/i386 を含め、386BSD から派生した OS は i386 上だと、VM_MAXUSER_ADDRESS=3G くらいだから 512MB くらいなら mmap できることが多いよ。 KVM を広げるようにカーネルを config してたり、 他にいろいろ mmap してたりすると 別だし、 0番値から MAP_FIXED で mmap してたらまずいけど。 >>617 は MAP_PRIVATE を入れただけじゃなくて、 MAP_FIXED は取り除いたんじゃないかな。 m68k 用 NetBSD は、カーネルとユーザ空間に別の 仮想空間を使っているので、ユーザ空間だけで 4GB 使えたり。 ユーザー空間が 4GB/2=2GB って OS は多いけど、 text に 2GB/2=1GB も割り当てるなんてもったいない ことしてる OS はないと思う。text は、実行ファイル に含まれている分しか確保されない。むしろ、 ヒープと stack の中間に shared library 用の mmap 領域があったりすることが問題。
631 名前:デフォルトの名無しさん mailto:sage [05/03/20 17:13:47 ] >>627 mmap は、いまや POSIX.1:2004 に含まれているので、 そこそこポータブルですが、なにか? Linux や *BSD など、POSIX.1:2004 をフル実装して ない OS でも、mmap に関しては、ほぼ POSIX.1:2004 の仕様を満たしているよ。もっとも、定義されている のは、各 OS の最大公約数程度の機能だけど。
632 名前:デフォルトの名無しさん mailto:sage [05/03/20 17:15:24 ] >>628 Windows のメモリマップドファイルって、ローカル ファイルシステムはマップできるけど、リモートに ある奴は駄目という不便な仕様だった記憶があるけど 今では直ったの? UNIX の場合、当然そんな制限はありません。
633 名前:デフォルトの名無しさん [05/03/20 17:28:28 ] >>631 POSIXに含まれている=ポータブルではない。 「そこそこポータブル」って何だよ。 > mmap に関しては、ほぼ POSIX.1:2004 の仕様を満たしているよ。 本当に?A LinuxとB LinuxとC LinuxとD LinuxとFreeBSDで使えても ポータブルとは言わないよ?
634 名前:デフォルトの名無しさん mailto:sage [05/03/20 17:32:10 ] わははは! ペイントハウスで思いのままだ!
635 名前:デフォルトの名無しさん mailto:sage [05/03/20 17:37:57 ] >>633 > 本当に?A LinuxとB LinuxとC LinuxとD LinuxとFreeBSDで使えても > ポータブルとは言わないよ? で、君は使えない処理系の一つでも挙げればいいんだけど、自分は何も知らないけど煽ってるだけと言うことでいいの ?
636 名前:デフォルトの名無しさん mailto:sage [05/03/20 17:46:23 ] >>633 POSIX.1:2004に書いてある仕様なら、Solaris, IRIX, Tru64, HP-UX, AIX は使ってないので知らんが。これで現在でもメンテされている 商用UNIXはほぼ全部。ちなみにこの程度の範囲の仕様なら、いにしえ の SunOS4 でも通用する。 mmap はシステムコールなので、別に A Linux, B Linux なんて 言わなくても全部の Linux で同じ動作だし、あの範囲の仕様な ら、実際に Linux でも通用する。FreeBSD に限らず、全ての 4.4BSD 派生 OS でも通用する。 最初にまともな実装が登場した SunOS4 の時代ならともかく、 あれから 15年も経った今でもポータブルでないっていうのは 時代遅れだと思う。
637 名前:636 mailto:sage [05/03/20 17:48:22 ] 編集してたら文章が欠けた… > POSIX.1:2004に書いてある仕様なら、Solaris, IRIX, Tru64, HP-UX, > AIX は使ってないので知らんが。 POSIX.1:2004に書いてある仕様なら、Solaris, IRIX, Tru64, HP-UX は 少なくとも満たしている。AIX は使ってないので知らんが。
638 名前:デフォルトの名無しさん mailto:sage [05/03/20 18:21:48 ] 611の言ったとおり、やっぱり商用UNIXじゃないとな。
639 名前:デフォルトの名無しさん mailto:sage [05/03/20 18:32:28 ] >>638 だったらAIX以外ならOKよ。 AIXは、mmapは大丈夫かもしれんが、そもそもOSが変態だから やめた方がいいかもしれん。
640 名前:デフォルトの名無しさん mailto:sage [05/03/20 18:34:24 ] > A LinuxとB LinuxとC LinuxとD Linux ワロタ
641 名前:デフォルトの名無しさん mailto:sage [05/03/20 18:45:28 ] ここで質問すると、かならず無駄に互換性の話まで拡大するのな。 大抵の質問者が環境書かないからだと思うけど、 今回は環境かいても無駄だった。
642 名前:デフォルトの名無しさん mailto:sage [05/03/20 18:55:20 ] で、件のFreeBSDでは動くのかというと、正確な所は誰も知らないと言う・・
643 名前:デフォルトの名無しさん mailto:sage [05/03/20 18:58:03 ] POSIX.1:2004 の範囲ならFreeBSDでも動くよ? 元々の610のプログラムはバグバグなので、どのOSでも動かん。
644 名前:デフォルトの名無しさん mailto:sage [05/03/20 19:13:13 ] たぶんWindowsなら動くんだよ。
645 名前:デフォルトの名無しさん mailto:sage [05/03/21 02:25:57 ] 特定のUNIXモドキ、しかも商用UNIXじゃないんだから 正確なところが分からなくても仕方ないと思う
646 名前:デフォルトの名無しさん [05/03/21 03:22:59 ] basename()が引数の指す先を変更することってあるんですか?
647 名前:デフォルトの名無しさん mailto:sage [2005/03/21 03:49:09(月) ] >>610 どこの本やサンプルを見たらあんなコードになるのか興味深い 駆逐したいのでどこを参考にしたのか教えて欲しい。
648 名前:デフォルトの名無しさん mailto:sage [2005/03/21(月) 09:16:03 ] >>646 ttp://www.linux.or.jp/JM/html/LDP_man-pages/man3/basename.3.html >path の内容を変更することがある。 だそうだ。
649 名前:デフォルトの名無しさん mailto:sage [2005/03/21(月) 09:43:42 ] ちゃんと嫁
650 名前:デフォルトの名無しさん [2005/03/21(月) 11:50:10 ] >>648 どちらかに決まってないんじゃ、呼び出した後free()すべきか どうかどうやって決めればいいんでしょう?
651 名前:デフォルトの名無しさん mailto:sage [2005/03/21(月) 12:21:58 ] free() ? 自分が確保したものは自分で free() するのが基本。 strdup() みたいに、ライブラリ内で確保するやつもいるけど、そういうやつはマニュアルに書いてある。
652 名前:デフォルトの名無しさん mailto:sage [2005/03/21(月) 12:35:46 ] >>650 > dirname および basename は、静的に割り当てられたメモリへのポインタを > 返すことがあり、これらの領域は後の関数呼び出しで上書きされるかもしれない。 …の部分に対する疑問? それなら、 char * path = "foo/bar"; char * path_dup = strdup(path_dup); char * path_dir = dirname(path_dup); して、 free(path_dup); すればいいだけだと思うが。 path_dup = dirname(path_dup); みたいにすると、path_dup が strdup で確保したメモリじゃない可能性があるから、 free() するべきかどうか分からなくなるがね。
653 名前:デフォルトの名無しさん mailto:sage [2005/03/21(月) 13:07:56 ] >>651 gethostbyname(3)なんかは、「*で返すのはstatic dataだべ」って書いてある。 www.opengroup.org/onlinepubs/007908799/xns/endhostent.html のAPPLICATION USAGE
654 名前:デフォルトの名無しさん [2005/03/21(月) 13:09:13 ] >>652 > char * path = "foo/bar"; > char * path_dup = strdup(path_dup); > > char * path_dir = dirname(path_dup); ここでpath_dirの指す先がpath_dupの中かもしれないので > free(path_dup); ここでfree()してしまうとpath_dirが使えなくなりませんか? 何かすごくおかしいことを言っているのだろうか・・・
655 名前:デフォルトの名無しさん mailto:sage [2005/03/21(月) 13:12:18 ] >>654 おまえ読解力ゼロ
656 名前:デフォルトの名無しさん mailto:sage [2005/03/21(月) 13:26:42 ] >>654 付け加えると、path_dirは必要ならすぐに自前の領域にコピーしておくこと。 ∵basename()を再度呼び出すと上書きされるから。
657 名前:デフォルトの名無しさん mailto:sage [2005/03/21(月) 14:02:44 ] >>652 > char * path_dup = strdup(path_dup); < char * path_dup = strdup(dup); 通りすがりに、取り合えず訂正しておくわ
658 名前:デフォルトの名無しさん mailto:sage [2005/03/21(月) 14:03:51 ] >>657 m9(^Д^)プギャー
659 名前:デフォルトの名無しさん mailto:sage [2005/03/21(月) 14:05:50 ] >>657 < char * path_dup = strdup(path); 間違えたわ…ハズ
660 名前:デフォルトの名無しさん mailto:sage [2005/03/21(月) 18:31:51 ] >>652 「静的に割り当てられたメモリ」ってのはライブラリがstaticに持ってるバッファだと 言ってるように読めるんだが(バッファじゃないがerrnoみたいな)。 であるとすれば、free()するとおかしなことになるよな。 >>651 が言ってるのはそういうことじゃないの?
661 名前:デフォルトの名無しさん mailto:sage [2005/03/21(月) 18:34:51 ] strdup1つでここまで引きずるとは、さすがUNIX
662 名前:デフォルトの名無しさん mailto:sage [2005/03/21(月) 18:42:03 ] >>660 だから basename の返り値を free しなきゃいいわけで、 basename に与えたポインタを free するのは問題ないだろ?
663 名前:デフォルトの名無しさん mailto:sage [2005/03/21(月) 18:58:49 ] ここは小学生の溜まり場かよ。
664 名前:デフォルトの名無しさん mailto:sage [2005/03/23(水) 02:23:26 ] >>660 が正しい。POSIX仕様であっても、basename()は 引数で与えられた領域を上書きすることはない。だから、 上書きされることを気にしてstrdup()する必要もない。 どうもglibc-2.2.1までのPOSIXバージョンは、POSIXの 解釈を間違えていて上書きしてたことがあったようだが。 これはglibc特有のバグで、glibcを使ってなければ関係 ない。>>648 の和訳のバグセクションは、そのあたりが 誤訳っぽいな。glibc-2.2.1より後でも問題があるように 読めてしまう。英語マニュアルを見れば明らかなんだが。
665 名前:デフォルトの名無しさん mailto:sage [2005/03/23(水) 05:35:24 ] >>664 POSIXはどうかしらないけど、FreeBSD5.3だと char * basename(const char *path); って定義になってるから、引数のバッファは変更されることはなさそうね。 ついでに、返り値は「a pointer to internal static storage space」を返すとなってる。 >>652 にあてはめるならこんな感じか。 char * path = "foo/bar"; char * path_dir = strdup(dirname(path)); /* ここでpath_dirを利用 */ free(path_dir);
666 名前:デフォルトの名無しさん mailto:sage [2005/03/25(金) 14:31:04 ] 666 ∈(・◎・)∋ 666
667 名前:デフォルトの名無しさん mailto:sage [2005/03/26(土) 14:48:43 ] 要するに、basename(3)使うときに、strdupもfreeも要らないわけだ
668 名前:デフォルトの名無しさん mailto:sage [2005/03/26(土) 19:16:44 ] (゚Д゚)ハァ?
669 名前:デフォルトの名無しさん mailto:sage [2005/03/27(日) 02:54:15 ] >>667 うん。ただし、basename(3)を複数回呼んで、その返り値を 後でまとめて使うような場合はmalloc(3)が必要となる。
670 名前:デフォルトの名無しさん mailto:sage [2005/03/27(日) 11:34:39 ] 別に固定バッファでもいいわけだが。
671 名前:デフォルトの名無しさん [2005/03/29(火) 17:59:02 ] 一つのプログラムファイルからしか使わない構造体があったとして それをヘッダファイルではなく、foo.cの中で宣言定義するのってのは、 スタイル的に問題ないのでしょうか?
672 名前:デフォルトの名無しさん mailto:sage [2005/03/29(火) 18:00:46 ] ここで質問する事が問題
673 名前:デフォルトの名無しさん mailto:sage [2005/03/29(火) 18:36:19 ] >>672 BSDのソースではあまりみかけないのに、Linuxでは沢山あるので
674 名前:デフォルトの名無しさん mailto:sage [2005/03/29(火) 20:13:11 ID:] 漏れは、他のファイルに見せる必要の無いものは、 実際に見えないようにすべき、と考えます。 unixとは全然関係ないけどね。
675 名前:デフォルトの名無しさん mailto:sage [2005/03/29(火) 20:23:30 ] させたいことと出来ることを一致させるのは大切ですね
676 名前:デフォルトの名無しさん mailto:sage [2005/03/30(水) 16:22:54 ] >>674 俺も ノシ
677 名前:デフォルトの名無しさん [2005/03/31(木) 15:18:49 ] suse9.1上でcを使って、ファイルサイズの取得方法を教えてください
678 名前:デフォルトの名無しさん mailto:sage [2005/03/31(木) 15:21:08 ] >>677 stat()
679 名前:デフォルトの名無しさん mailto:sage [2005/04/02(土) 23:47:35 ] hcreate()ってプログラムの中でひとつのハッシュ表しか使えないんですか? だとしてこれは役に立つことがあるんでしょうか?
680 名前:デフォルトの名無しさん mailto:sage [2005/04/03(日) 01:03:52 ] そりゃあるでしょ。 複数使いたければ、hcreate_r()使いなよ。
681 名前:デフォルトの名無しさん mailto:sage [2005/04/05(火) 01:13:50 ] hcreate() なんてシラナンダ。自作してた…。 hcreate_r() は GNU 拡張か。
682 名前:デフォルトの名無しさん mailto:sage [2005/04/05(火) 01:50:35 ] >>681 プラットフォームによってはバグってたりするから使わない方がいいよ 追加できるエントリ数にこっそり上限があったり
683 名前:デフォルトの名無しさん [2005/04/05(火) 10:51:56 ] program_a が program_b を呼び出すようにしています. gdb で program_b の動作をデバッグするには どうすればいいのでしょう?
684 名前:デフォルトの名無しさん [2005/04/05(火) 11:15:04 ] >>683 program_b の最初の辺りに sleep なり, 入力待ちなりを入れといて, ps | grep program_b して gdb <pid-of-program_b> する. どっちかってゆうと, ウニ板のくだ質ネタだが...
685 名前:デフォルトの名無しさん mailto:sage [2005/04/05(火) 12:09:45 ] >>683 "program_b arg1 arg2" ↓ "gdbserver localhost:20000 program_b arg1 arg2" $ gdb gdb> target remote localhost:20000 gdb> break xxx gdb> continue
686 名前:デフォルトの名無しさん mailto:sage [2005/04/05(火) 21:37:03 ] Windowsみたいにcch埋め込みして自動でデバッガ起動とかできないの?
687 名前:デフォルトの名無しさん mailto:sage [2005/04/05(火) 21:47:46 ] core吐いたら、そこからデバッグを再開出来る気もする
688 名前:デフォルトの名無しさん mailto:sage [2005/04/06(水) 00:02:56 ] >>686 こんな感じでいいのか? 以下を実行すると、自身を対象にgdbのウィンドウが立ち上がる。 char pidbuf[20]; snprintf(pidbuf, sizeof pidbuf, "%d", getpid()); if (fork() == 0) execlp("xterm", "xterm", "-e", "gdb", argv[0], pidbuf, NULL); sleep(5); /* wait for gdb */ かなーりいい加減な実装だけど。
689 名前:デフォルトの名無しさん [2005/04/06(水) 10:45:22 ] Unixプログラミングを詳しく 網羅した質の高いサイトを この俺に教えてください
690 名前:デフォルトの名無しさん mailto:sage [2005/04/06(水) 11:05:39 ] つ ttp://www.adl.nii.ac.jp/~moro/unix-programmer/faq-j_toc.html
691 名前:デフォルトの名無しさん [2005/04/06(水) 15:24:06 ] CSVをパースするライブラリくれ 書くのめんどい つーか、どう考えても世の中に大量にあるだろそんな汎用ライブラリ どうしてgoogleで引っかからないんだこれ だれかの陰謀か? 宇宙人?
692 名前:デフォルトの名無しさん mailto:sage [2005/04/06(水) 15:26:47 ] >>691 perl >>>>>>>>>>>>>>>>>>>> ruby search.cpan.org/search?query=csv&mode=all
693 名前:デフォルトの名無しさん mailto:sage [2005/04/06(水) 16:41:41 ] > perl >>>>>>>>>>>>>>>>>>>> ruby > search.cpan.org/search?query=csv&mode=all まぬけですね
694 名前:デフォルトの名無しさん mailto:sage [2005/04/06(水) 17:24:05 ] > > perl >>>>>>>>>>>>>>>>>>>> ruby > > search.cpan.org/search?query=csv&mode=all > > まぬけですね まぬけですね
695 名前:デフォルトの名無しさん mailto:sage [2005/04/06(水) 17:36:22 ] Cでくれ
696 名前:デフォルトの名無しさん mailto:sage [2005/04/06(水) 17:52:29 ] 一発動かすだけみたいなやつなら perl で十分だろうし、 そうでないなら... > 691 名前:デフォルトの名無しさん[] 投稿日:2005/04/06(水) 15:24:06 > CSVをパースするライブラリくれ > 695 名前:デフォルトの名無しさん[sage] 投稿日:2005/04/06(水) 17:36:22 > Cでくれ この間になんぼでも書けるだろう。
697 名前:デフォルトの名無しさん mailto:sage [2005/04/06(水) 18:28:29 ] C-- (C Decre)
698 名前:デフォルトの名無しさん mailto:sage [2005/04/06(水) 21:04:08 ] >>691 何故みつからないかというと、みんなが納得する"CSV"という 名前のフォーマットは存在しないからです 標準化されていない悲しさよ
699 名前:デフォルトの名無しさん mailto:sage [2005/04/06(水) 21:24:12 ] そんなことなかろう。 google で "comma separated value" parse library を検索すると見つかるぞ。 単に探し方が悪いだけだと見た。
700 名前:デフォルトの名無しさん [2005/04/06(水) 23:00:19 ] CSVって、 ・フィールド,で区切られている。 ・#から改行までは無視。 ・,#をデータに入れたい時は、"tell your #, please!"とクォート。 ・レコードは改行で区切られている。 が典型的かな。 >>698 色々と問題が起きそうなのは、 ・改行コード。 ・ISO-2022-JPの様な左面の文字集合切り替えのある場合。 かな。
701 名前:デフォルトの名無しさん mailto:sage [2005/04/06(水) 23:08:41 ] >>700 > ・,#をデータに入れたい時は、"tell your #, please!"とクォート。 マジかよ そんなエスケープ初めて聞いた
702 名前:デフォルトの名無しさん mailto:sage [2005/04/07(木) 09:11:15 ] CSV ・1行で1レコード。 ・コンマ「,」をデリミタとして値を区切る。 ・値にコンマが含まれているときにはダブルクォート「”」で括る。 ・値にダブルクォートが含まれているときは「””」と2重にする。 多少の方言はあるけど、だいたいこんなんが基本。 というのが漏れの理解。
703 名前:デフォルトの名無しさん mailto:sage [2005/04/07(木) 09:41:22 ] 値に「"」が含まれていたら「''」でクォートとか、「\」でエスケープとか、 文字列フィールドに数字しかないときは「'」が先行するとか、 微妙にいやらしい方言が多いんだよね。
704 名前:デフォルトの名無しさん mailto:sage [2005/04/07(木) 10:12:33 ] だからライブラリが無いw
705 名前:デフォルトの名無しさん mailto:sage [2005/04/07(木) 12:35:08 ] ""の中に改行が含まれるケースもある 1,"abc","def",ghi,1111 2,"abc","This is a quoted string.",def,234 3,"abc def","hoghoge",aaa,234 みたいな
706 名前:デフォルトの名無しさん mailto:sage [2005/04/07(木) 14:22:07 ] >>705 lex 辺りでアナライザーはかせりゃ, 悩むほどのもんじゃねぇだろ? あとは, yylex 呼ぶループ書くだけ.
707 名前:デフォルトの名無しさん mailto:sage [2005/04/07(木) 14:30:47 ] この程度、lex 使わずに手書きしても全然たいしたことない。 この程度が書けないような香具師は、Cを使うのはやめて、 Java とか Perl とか Python とか Ruby とか VB に転向すべき。
708 名前:デフォルトの名無しさん mailto:sage [2005/04/07(木) 14:32:23 ] Perl なら ttp://www.din.or.jp/~ohzaki/perl.htm#CSV2Values PHP なら ttp://jp.php.net/manual/ja/function.fgetcsv.php があるけどね
709 名前:デフォルトの名無しさん [2005/04/07(木) 15:00:15 ] メールサーバでReceived:の項にJSTなどとタイムゾーンが文字で入りますが、あれは取得できる物なのでしょうか? それとも、メールサーバのプログラムの中にそのようなテーブルがあるのでしょうか?
710 名前:デフォルトの名無しさん mailto:sage [2005/04/07(木) 15:02:40 ] >>707 > この程度、lex 使わずに手書きしても全然たいしたことない。 ゴリゴリ手書きして遅いルーチンを書くのはいとも簡単だけど、 (f)lexと同等かそれ以上に高速なものにしようとすると結構大変かも。