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


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

【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 131



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/

560 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 00:15:06 ]
ファイルの行数を数えてその分配列を確保したいのですが、
このような配列の使い方(foo関数の部分)をしていいのでしょうか?
malloc()した方がいいんでしょうか。

よろしくお願いします。

int main()
{
  int line_count;

file_line_count(&line_count); //ファイルの行数を数える関数
foo(line_count);
}

void foo(int line_count) //foo関数
{
  int array[line_count]:
       ^^^^^^^^^^^^^^
  :
  :
}

561 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 00:33:19 ]
>>560
対象とする規格による。いわゆる C99 なら標準で認められている。
C99 より前の C の規格や現行の C++ では認められていない。

562 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 00:34:16 ]
>>560
そのような可変長の配列はC99で採用された仕様だから、
一部のC89信者に蛇蠍の如く忌み嫌われる。

まぁ、C99限定でいいのなら使っていいと思うよ。
但し、スタックサイズに注意すること。

563 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 02:47:44 ]
関係ないけどファイルの行数を数える関数で戻り値使わないでポインタ渡しなのが気持ち悪い・・・

564 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 02:51:17 ]
昔あった、関数は全部voidで宣言しろっていうとんでもないコーディングルールを思い出した

565 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 04:45:24 ]
>>564
戻り値を表示できるデバッガが無かったとか?

566 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 08:22:36 ]
でも結構しっかりしたC用のAPIだと戻り値はエラー状態を表すのに使われていて、
本来戻り値になるであろうものもポインタの引数になるというのはよく見かける。

567 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 08:33:37 ]
MPI とかそんな感じだったような。

568 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 09:41:44 ]
余計 void はありえないなw



569 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 11:30:55 ]
戻り値のチェックを忘れる馬鹿がいるから、とかじゃね?

570 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 11:36:05 ]
is〜な問い合わせ関数でも、戻り void でステートをポインタ引数に取るのか…
たまんねーコーディング規約だな

571 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 23:25:39 ]
>>570
うんにゃ
ポインタは渡さない
後はわかるな?

572 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 23:33:04 ]
よりよってグローバル変数かよ。

573 名前:572 mailto:sage [2007/06/04(月) 23:33:55 ]
"に"が抜けた。

×よりよってグローバル変数かよ。
○よりによってグローバル変数かよ。

574 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 23:52:32 ]
>>572-573が妙にイラッと来る

575 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 00:02:58 ]
×>>572-573が妙にイラッと来る
>>572-573が妙にムラッと来る

576 名前:560 mailto:sage [2007/06/05(火) 00:03:24 ]
>>561
>>562
有難うございます。

色々つっこまれてる。(;゚□゚)

577 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 05:00:17 ]
>>571
まあ、N88-BASIC のコードを移植するプロジェクトならアリかもしれんが・・・。

578 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 13:40:27 ]
>>572
eax だってグローバル変数だー (i86系)



579 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 13:42:30 ]
スマン環境依存スレじゃなかった

580 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 13:42:38 ]
>>578
いくらなんでもスレ違い。どっか他所でやってくれ。

581 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 13:53:48 ]
レジスタはスレッド切り替わる時に退避されるからスレッドセーフで、
グローバル変数なんかとは格が違う。

582 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 14:01:55 ]
>>581
>580

583 名前:デフォルトの名無しさん [2007/06/13(水) 23:07:43 ]
pc11.2ch.net/test/read.cgi/prog/1175485506/758

char *data = 30000;
↑これに対して↓を行うと
gcc -fsyntax-only -x c -std=c99 -pedantic -Wall -Wextra

:1: warning: initialization makes pointer from integer without a cast

と警告は出るけどエラーにはならない。あれ?と思って規格を見た。

6.7.8 Initialization p11 に
"the same type constraints and conversions as for simple assignment apply"
とあったので 6.5.16.1 Simple assignment の Constraints を見たけど、
左辺ポインタで右辺が整数というのは認められないように見える。

規格ではエラーになるべきなんじゃないの?
ちなみに C++ では思ったとおりエラーになった。

584 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 23:09:15 ]
暗黙の・・・

585 名前:デフォルトの名無しさん [2007/06/22(金) 04:01:03 ]
ファイルサイズの取得方法って、「ftell」を使用するのが常道なんでしょうか。

Cでファイルサイズを取得する場合、自分は「fgetpos」を使用すのかなーと漠然と考えていて【B】のようなソースを考えていたんですが、
>>402がファイルサイズの取得方法として「ftell」を利用してるとのことだったので、【A】のようなソースも考えてみました。
やはりAのほうがよいのでしょうか。。。

========================
【A】
========================
long size = 0L;
FILE *fp = NULL;
fp = fopen( "hogehoge.jpeg", "rb" );
if ( fp == NULL ) {
 /* エラー処理 */
} else {
 if ( fseek( fp, 0L, SEEK_END ) != 0 ) {
  /* エラー処理 */
 } else {
  size = ftell( fp );
  if (size == -1L ) {
   /* エラー処理 */
  }
  if ( fclose( fp ) != 0 ) {
   /* エラー処理 */
  }
 }
}
/* sizeの値がhogehoge.jpegのファイルサイズ */

586 名前:585 [2007/06/22(金) 04:01:52 ]
で、Bです。
========================
【B】
========================
fpos_t *pos;
FILE *fp = NULL;
fp = fopen( "hogehoge.jpeg", "rb" );
if ( fp == NULL ) {
 /* エラー処理 */
} else {
 if ( fseek( fp, 0L, SEEK_END ) != 0 ) {
  /* エラー処理 */
 } else {
  if ( fgetpos( fp, &pos ) != 0 ) {
   /* エラー処理 */
  }
  if ( fclose( fp ) != 0 ) {
   /* エラー処理 */
  }
 }
}
/* posの値がhogehoge.jpegのファイルサイズ */
/* fpos_tってキャストできそうだからサイズの値が取れると思ったのですが。。。 */
========================


587 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 04:02:02 ]
環境依存の方法を使うのが普通じゃないかな。

588 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 04:04:05 ]
>>586
全然本質じゃない細かいところで
> fpos_t *pos;
これは
fpos_t pos;
だよね。多分わかってはいるとは思うんだけど。



589 名前:デフォルトの名無しさん [2007/06/22(金) 04:14:58 ]
fpos_tって別の変数にキャストしたりするとき困らない?

fpos_tって環境依存だからlong long型とは限らないと聞いたことがある。


590 名前:デフォルトの名無しさん [2007/06/22(金) 04:19:29 ]
横からすみません。

この>>585って、もしhogehoge.jpegのファイルサイズが巨大だった場合、
どうなっちゃんですか?

591 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 05:16:26 ]
標準Cでは2GBを超えるファイルのサイズを知る手段はないって結論になる。
fpos_tがキャスト可能であることは保障されていないことだし。

ファイル関連は標準Cだけで書くのを諦めて、64ビット系のstat()相当の関数を使うのが無難じゃない?

592 名前:デフォルトの名無しさん [2007/06/22(金) 06:19:36 ]
>>587〜のみなさん、ありがとうございました(588さんご指摘ありがとうございます)。
ファイルのサイズが大きい場合のことまで頭が回っていませんでした。
標準Cでは難しそうですね。
stat等の機能を持つ関数使用が無難といったところでしょうか。
一応stat使用時のソースも考えてみましたが…

struct stat fInfo;
if ( stat( "hogehoge.jpeg", fInfo ) != 0 ) {
 /* エラー処理 */
} else {
 /* fInfo.st_sizeにファイルサイズが入る */
}

あるいは・・・非 POSIX 標準 API インタフェースで(UX上で動作)

struct stat64 fInfo;
if ( stat64( "hogehoge.jpeg", fInfo ) != 0 ) {
 /* エラー処理 */
} else {
 /* fInfo.st_sizeにファイルサイズが入る */
}









593 名前:デフォルトの名無しさん [2007/06/22(金) 07:49:47 ]
相乗り質問ですいませんが
ファイルサイズ自体を知りたいのではなくて
ファイルサイズがある一定値を超えているか否かを判定したい場合も、
やはりstatなりftellなりでバイトサイズを一度取得してから
if文で判定するしかないですよね。

2GBだろうが3GBだろうが、とにかくある値を
超えてるか超えてないかだけわかればいいのですが。。。

594 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 08:16:12 ]
ファイル開いたらある値まで無理矢理ファイルポインタ動かしてみて
エラーが出るかを拾うってのはどうだろう
やっぱ2GB超えちゃうとダメなのかな

595 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 08:36:48 ]
そもそもファイルが開けないとサイズが調べられないプログラムはどうかと思うんで、
stat64 なりで調べた方がいいと思うよ。

596 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 08:45:05 ]
ていうかPOSIX環境だと_FILE_OFFSET_BITS=64が無ければ
2G以上のサイズはのopen/fopen自体が失敗する。
Windows環境だとopenは出来るけど、seekが出来ない(シーケンシャルには読める)。
それぞれ、open64や_lseek64(bccには無い)を使う。
もちろん、_FILE_OFFSET_BITS=64なら、openだけでよい。

また、statも同様に、_FILE_OFFSET_BITS=64ならstatだけで良いが
それ以外はstat64等を使う。

597 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 09:31:14 ]
そもそもfseek()はエラーを返せない。

598 名前:デフォルトの名無しさん [2007/06/22(金) 09:54:27 ]
stat構造体のst_sizeはoff_t型だから、……
long int型になるのかな、
そうするとlong int型に格納しきれないバイト数のファイルは
桁あふれするのかな? 0? 再現させてテストしたいが
環境が手元にないのだが。。。。。。



599 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 10:00:42 ]
だからoff_t型の大きさは_FILE_OFFSET_BITSや_LARGEFILE64_SOURCEによって変わる。
off_tに格納できないようなサイズのファイルは、そもそもstat自体が失敗する。

600 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 10:07:58 ]
あ、Windowsだとstatは失敗しないな。たぶん。
で、結果がどうなるかは処理系(ライブラリ)依存。
何故ならstatはエミュレーションしているので、
stat("c:/*", &st)が成功してしまったりする処理系があるから。

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++];






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

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

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