1 名前:デフォルトの名無しさん [2007/02/01(木) 23:08:46 ] このスレは標準Cのみの限定スレです。 まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。 質問する前には最低限検索を。 エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。 C FAQ 日本語訳 www.kouno.jp/home/c_faq/ Cプログラマ必読 ・プログラミング言語C(通称 K&R) www.amazon.co.jp/exec/obidos/ASIN/4320026926/250-7563469-9920244 他の過去ログはここに nssearch.hp.infoseek.co.jp/clang/ 前スレ 【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 130 pc10.2ch.net/test/read.cgi/tech/1159613789/ GUIなどの標準Cではできない事の質問,ソース丸投げ、宿題、書籍 は 専門の別スレッド↓があるのでそこへさようなら。 【初心者歓迎】C/C++室 Ver.34【環境依存OK】 pc10.2ch.net/test/read.cgi/tech/1169039760/ C/C++の宿題を片付けます 82代目 pc10.2ch.net/test/read.cgi/tech/1169575464/
601 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 11:44:19 ] ファイルサイズというのが何を意味するかによる。 OS上でのサイズのことなら、 そもそも環境依存なので環境に用意されたAPIを好きなように使えばいい。 Cの入出力関数で読んだときのバイト数のことなら、 読めないようなものは無視してしまえばいい。 まあ、なんでファイルサイズを知りたいのかってとこまで 一回さかのぼって考えてみるのも一計。
602 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 22:25:44 ] サイズは「サイズ」以外ないだろ。 「文字数」とは違う。
603 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 08:17:34 ] 昔のCP/Mはセクタ数でしか管理してなかったなぁ
604 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 08:53:01 ] >>603 今のCP/Mとやらはどう管理しているの?
605 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 09:23:37 ] >>603 最終セクタの0x1Aまでがファイルの「サイズ」だろ?
606 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 09:45:36 ] でもそれは管理されてない。
607 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 09:54:38 ] ん、「管理されているかどうか」という話なの? 「ファイルのサイズとは何か」という話の揚げ足を取ろうとして墓穴を掘っただけじゃなかったの? だったらそれでいいけど。
608 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 09:57:38 ] あっと、 「ファイルのサイズとはOSに管理されていなければならない」という 話の流れとは関係ないことを言いたかっただけで 「ファイルのサイズとは一意に決まるものである」ということに対する反論じゃなかったって事ね。
609 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 10:25:40 ] バイナリファイルは「0x1aまで」というルールを採用できないからセクタ単位でしかサイズを得られない。
610 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 03:19:11 ] ファイルシステムがファイルのサイズをセクタ単位でしか管理してない上に、 テキストとバイナリで終端の扱いが違うようなシステムだって存在してたんだ。 統一した「ファイルサイズを得る方法」なんてあるわけがない。 あー、それから人の書き込みが何でも揚げ足取りに見えるとしたら重症だぞ。
611 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 03:23:51 ] ファイルサイズを取得する関数が標準で用意されなかったのは、 そのあたりが理由なのかな?
612 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 04:03:56 ] >>611 そそ、ファイルシステムという概念も統一できないからディレクトリ操作関係も入れられていないし ファイル操作もストリーム処理系を除くとremove()位しかない。
613 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 04:31:09 ] MS-DOS 1.0 もディレクトリないんだっけ?
614 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 04:43:31 ] 汎用機もねーよ
615 名前:デフォルトの名無しさん [2007/06/24(日) 22:22:42 ] C言語をはじめたばかりであまりわからないのですが、 ビットシフトはなんの役に立つのでしょうか?
616 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 22:24:17 ] そのネタ飽きた
617 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 10:05:04 ] そういや、xmodemプロトコル(無印)もファイルサイズの概念無かったな 128バイトのブロック単位だったからファイルの後ろにはゴミがついていた Mac専用にファイル名やサイズをヘッダにつけるマックバイナリができたっけ・・
618 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 10:55:57 ] マックバイナリができた事情はリソースフォークの管理のためだが詳細はスレ違いにつき割愛。
619 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 11:58:13 ] リソースフォークの話は出してくるやつが出ると思った リソース/データフォークのサイズもファイルサイズの指定の意味で 書いたんだがわからなかったんだろう
620 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 15:09:30 ] >リソース/データフォークのサイズもファイルサイズの指定の意味で >書いたんだがわからなかったんだろう これ日本語なの?
621 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 19:06:14 ] まるでXMODEM対応のためにマックバイナリが作られた様な表現はどうと思う。
622 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 19:07:17 ] どうと思う! いや、どうかと思う、だorz
623 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:39:59 ] MFCでCString型の変数strにメタ文字の.が入っている場合\記号と連結するのに str = "\\" + str; これで全然問題ないのですが、標準のCで char str[MAX_PATH]; strcpy(str, "."); starcat("\\", str); こうするとアクセスバイオレーションが発生します どうしたらええの? strcpy(str, "\.");これでも駄目だった そうそう環境はWinXPSP-2、VC6です
624 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:41:45 ] >>623 starcat なる謎の関数の仕様をよーく確認しろ。
625 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:42:52 ] 星猫
626 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:46:52 ] スマンstrcatだったMSDN見ても問題ないと思うのだが? 文字列の連結するんだよねstrcatって、まぁ今回は連結する方もされる方も一文字だったが
627 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:48:00 ] >>626 じゃぁ strcat の仕様をよーく確認しやがれこのバ
628 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:48:55 ] そりゃ文字列リテラルに文字列を追加しようとしたら落ちるわな。
629 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:50:02 ] それでもstarcatならきっとやってくれるさ
630 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:50:05 ] MFC 使える環境なら CString か std::string 使えば? そっちの方が幸せになれるよ。セキュリティ的にも。
631 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:56:52 ] >>628 ところがどっこいリラテルでなくてもアクセスバイオレーションが起こるんだよねこれがまたww >>630 だからMFCなら全然無問題なのだが、Cの事も知りたいからよ
632 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:56:54 ] >>626 strcatでは、後ろに追加することしか出来ないんだ。 "//"には、後ろにstrを追加する余裕なんて無い。
633 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 14:59:06 ] >>631 ならリテラル以外で問題が再現するコードを書いてみやがれ
634 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:00:41 ] >>631 C は面倒臭いよ。 バッファオーバーフローをいちいち気にしないといけないから。
635 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:04:06 ] sprintf()一回ですむことをstrcpy(), strcat()を駆使しようとするからそうなる。 しかし、やりたいことがよく判らないからサンプルを書けない。 例えばディレクトリとファイル名を連結したいだけならこうなるのだが。 sprintf(path, "%s\\%s", dir, file)
636 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:08:05 ] >>631 どうせ初期化してないのに strcat とかしたんじゃないのか?
637 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:12:33 ] 元のCStringを使ったコードはこうなっていると解釈するぞ。 CString str = "."; str = "\\" + str; char str[MAX_PATH] = "."; size_t size = strlen(str) + 1; if (size >= MAX_PATH) abort(); /*好きにしてくれ*/ memmove(str + 1, str, strlen(str) + 1); str[0] = '\\'; WindowsならTCHAR系使えという気もするが、とりあえずcharにしておいた。
638 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:39:04 ] BoehmGCのようなライブラリを使えば char *str = ".", *tmp; tmp = GC_MALLOC(strlen(str) + strlen("\\") + 1); sprintf(tmp, "\\%s", str); str = tmp; でいいよ んでも毎回strlen()とかすんのはウザいので、 typedef struct string_t { char *s; size_t len; } string_t; とかして、string_tに対する操作を関数で一通り作るといいよ んでもそんなアホくさい作業をするくらいならC++で素直に std::basic_string<>使ったほうがいいよ
639 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:53:40 ] MFC使っているならCStringもありさ
640 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 19:19:12 ] strcpy -> strncpy strcat -> strncat sprintf -> snprintf
641 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 20:09:50 ] >>640 残念ながら、前2者は仕様が仕様だから推奨できない。そして最後は未だ標準じゃない。
642 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 21:07:18 ] 結局C++でstd::basic_string<>なりMFCのCStringなりを使えということになる。 何より楽だし。
643 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 22:28:15 ] バッファオーバーフロー脆弱性の話を聞くたびに、 敢えて C を使う以上はエラー処理ちゃんとしろよと思ってしまう。 それができないなら C++ にしる、と。
644 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 23:19:51 ] >641 C99は未だ存在しないのか・・・
645 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 23:22:59 ] C99 が使える環境では snprintf を使って、 使えない環境なら等価な関数に #define すればいいんじゃない?
646 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 23:26:40 ] snprintf()に等価な関数なんてないっしょ。環境によってはあるんだっけ?
647 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 23:33:00 ] VC++ には _snprintf がある。
648 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 00:13:07 ] char *s; FILE *fp = fopen("/dev/null", "w"); size_t len = fprintf(fp, ...); /* 長さを数えてもらう */ fclose(fp); s = malloc(len + 1); sprintf(s, ...); 勿論こんなコードを使うぐらいならapacheあたりのコードをパクるのが良いが それぐらいならやっぱりC++を使うべきという結論に
649 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 00:38:37 ] >>648 必要なバッファの大きさを求める部分は、関数化して切り出すべきだと思う。 C99ならsnprintf(NULL, でいいし、VCなら_scprintfが使えるし。
650 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 00:48:37 ] >>649 そいつらの代替実装の話だろ。
651 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 00:48:40 ] 問題は移植性の低さだな 標準とはいえC99未対応のCコンパイラは多い
652 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 01:00:52 ] snprintf 程度なら、C99 に対応してない処理系でも大抵独自に用意されてるんじゃない?
653 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 01:09:55 ] >>652 あってもC99と同じ仕様とは限らん たとえばSingle Unix Specificationだと、たしか返り血が違うんじゃなかったか
654 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 03:06:17 ] その場合は自分でラッパ関数を定義すればいいんじゃないかな?
655 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 21:29:01 ] *BSD LIBCあたりから掻っ払って来りゃええやん。
656 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:59:02 ] ねぇねぇおまえらちょっと教えてくんない ファイルの行数を取得する標準関数なんてないよね そんなことがしたい時ってやっぱ一旦ファイルを全部読み込んでそん時に\nの数 数えるとかやってんの? どうよ
657 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 23:03:13 ] そうする
658 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 23:34:14 ] それ以外の方法があるなら是非とも教えてもらいたいもんだ
659 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 23:50:13 ] fp = fopen(filePath,"r"); while(fgets(szBuff, MAX_PATH, fp) != NULL) { maxLine++; } fclose(fp); char szItem[7][maxLine++]; じゃぁこれはどうよ、二次元配列が作りたくてこうやったら error C2057: 定数式が必要です、MSDNとか調べてsupport.microsoft.com/kb/142493/ja char szItem[7][((const int)maxLine++]; こうしてもなおんないんだよねぇこれってどうよ
660 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 23:52:13 ] スマン訂正 int maxLine; 罰char szItem[7][((const int)maxLine++]; 丸char szItem[7][(const int)maxLine++];
661 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 23:59:58 ] C99じゃない限り配列の大きさはコンパイル時に固定=定数
662 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 00:07:53 ] あきらめきれなくて 回避策はないのかと聞いてみる
663 名前:デフォルトの名無しさん [2007/07/05(木) 00:09:15 ] ttp://www23.atwiki.jp/homework/pages/11.html#id_062fdb0f のwikiに載っていたリサージュのプログラムで x = cos(2 * PI * a * t); y = sin(2 * PI * b * t); の2の値を自由に変えられる(自分で入力できる)ように したいんですけど、どうやったらいいですか?
664 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 00:10:28 ] >>662 malloc使えばいいんじゃない
665 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 00:12:44 ] >>664 クワシク
666 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 00:17:10 ] そこらへんの入門書に書いてある。 残念ながらここで1から説明していられるほど簡単に説明できる機能ではない。
667 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 00:53:10 ] >>662 寧ろ、C++でstd::vector使えばいいんじゃない?
668 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 01:32:50 ] ドウシテC99ヲツカワナイノデスカ
669 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 16:48:51 ] ドウシテC99ガフキュウシテルトオモウノデスカ
670 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 16:50:55 ] C99 使うくらいなら C++ 使う
671 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 16:52:17 ] んだな
672 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 23:13:16 ] 単項演算子の+って、どう言ったときに役に立つのでしょうか? Cだけの話ではないかもしれませんが。
673 名前:デフォルトの名無しさん mailto:age [2007/07/05(木) 23:13:35 ] メジャーなコンパイラでC99に対応してないのってあるの? 俺趣味グラマでgccしか使わんからわからん。
674 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 23:16:17 ] >>673 VC++
675 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 23:20:05 ] >>672 桁合わせくらいには役に立つことはあるかも。
676 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 23:47:34 ] >>672 -があるから+も装備したらしい
677 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 00:45:33 ] 昔、 #ifdef xx # define SYM 10 #else # define SYM #endif のような時に int num = SYM +0; というような使い方をした覚えがあるような無いような。
678 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 01:20:07 ] マクロ関連で役に立つことがたまにありそうではあるな。
679 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 01:35:03 ] 正確には、式に単項演算子をつけない場合は+を省略したものとみなされる・・・じゃなかったっけ?
680 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 01:36:20 ] 単項+のオペランドも式だし、 単項+のオペランドになれない式もあるだろ。
681 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 03:44:31 ] #ifdef xx # define SYM 10 #else # define SYM 0 #endif では、何故ダメだったのか教えてほしい。
682 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 22:11:51 ] 学校でC言語実習やったんだがどうしてもわからないことがあったんで聞いてみる。 ○×ゲームを作るプログラムを作っていたんですが。 1〜9の数字キーでどこのマスを使うか決めるプログラムなんです。 line1[10]=" 789\n", line2[10]=" 456\n", line3[10]=" 123\n", という行があるんだが↑このスペース間をTabキー使って開けたらエラーが出たんですが 何故Tabキー使っては駄目なのか教えていただけませんか?
683 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 22:17:17 ] >>682 書き換える前後で strlen(line1) の数値を比べてみれば分かるんじゃないかな
684 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 22:37:32 ] いやコンパイルエラーになるんだろ。 たぶん、構文的に駄目になっているのだろうとしか言えない。 後できちんと規格書に当たってみる。 とりあえず、文字列リテラルの中でタブ文字を表現したければ、 タブを直接入力する代わりに\tを使えばいいと言っておく。
685 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 22:44:18 ] >>683 ほんとにCはかじったばっかりなんでよく分からない上に 今気づいたんだけどスペースに半角使用してしまったため↑の位置が変すぎる('A`) "と7のスペースね。 strlenって言ったら文字列の長さだよね? Tabキーのスペースは普通のスペースの何個分もあるけど1カウント?しかしないという解釈でいいのだろうか?
686 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 22:48:07 ] >>685 やってみたほうがよく分かる
687 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 23:05:02 ] >>684 指導書に基づいてプログラム作ってるんだ。 基本的に書き換え不可だからそういうことはできないんだ >>686 ほんとに実習でやってるだけだしそんな環境ないんだけど('A`)
688 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 23:12:54 ] 環境もないのに実習なんて言うのか?
689 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 23:28:53 ] >>688 ヒント:やるのは学校今は家にいる 学校のPCは勝手に使っちゃいけないんだ。
690 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 23:30:22 ] じゃぁ学校でやれよ。ここで文句言われてもどうしようもない。
691 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 23:32:15 ] >>689 今書き込みをしているのが自分の自由に使えるPCからなら、 開発環境をインストールすることを勧める
692 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 23:36:48 ] >>691 今やってみたがページが真っ白のまま止まってしまう。 ダメみたいだ/(^o^)\
693 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 23:38:11 ] とりあえずお前はCの勉強する前にPCの勉強をしろ。
694 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 23:40:29 ] >>692 Windows Vista と予想
695 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 23:49:11 ] やっぱり聞くんじゃなかったかな。 もう書かないよ。僕のせいで13レスも進んでしまって申し訳ない。
696 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 23:54:59 ] そりゃあんた、初心者スレなりに行けばいいものをこんなスレに書くからだ。
697 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 23:59:16 ] 寿司食いたい
698 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 09:13:41 ] 基本的に書き換え不可なのに、なんでスペースをタブにしようとすんの?
699 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 10:29:56 ] スペースをタブにできるなら、スペースを\tにもできるだろう
700 名前:デフォルトの名無しさん [2007/07/12(木) 10:53:19 ] ファイルがテキストファイルかバイナリーファイルかを Cプログラムで判定したいのだけれど、方法を教えてくれ。