[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 05/09 12:29 / Filesize : 215 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

UNIXプログラミング質問すれ Part5



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と同等かそれ以上に高速なものにしようとすると結構大変かも。







[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<215KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef