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


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

【初心者歓迎】C/C++室 Ver.40【環境依存OK】



1 名前:デフォルトの名無しさん mailto:sage [2007/07/18(水) 09:10:30 ]
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.39【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1182740506/
【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

348 名前:317 mailto:sage [2007/07/25(水) 08:59:52 ]
あれから色々調べてみたんですが、特定のエスケープシーケンスの文字化けは
CDTに限ったことでは無いようです(OSの問題かな?)まあ色々分かったので
もうちょっと調べていこうと思います。cの問題では無かったですね;すみません。

349 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 09:00:19 ]
だから BCB は腐ってるから使うなとあれほど・・・

350 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 09:06:13 ]
const 参照を使うと

const int& r = 1;

といったことができるが、
この時はテンポラリオブジェクトが作られて、それへの参照が作られる。

昔は const なしでもこういうことができることがあった。
規格がまだ整理されてなかった時代だったからなのか、独自の拡張だったのかは知らんが。
ここではそれが起こってるんだろう。

351 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 12:16:56 ]
質問です。
fopen_sってGCCみたいなVC以外の環境でも普及していて普通に使えるのでしょうか?

352 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 13:08:38 ]
>>351
ぜんぜん普及してないです。VC++だけ。


353 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 13:16:59 ]
だから GCC は終ってるから使うなとあれほど・・・

354 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 13:24:54 ]
普及していないが、Open Watcomでも使える。
また、標準規格に盛り込まれれば、glibc辺りにも実装されるだろう。

355 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 13:56:24 ]
今C言語勉強中なんですけど
本とかサイトとかで一人で勉強してもある程度身につくものでしょうか?

356 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 14:18:27 ]
大多数の人は一人で勉強してます



357 名前:デフォルトの名無しさん [2007/07/25(水) 14:24:38 ]
double型をstirng型に変換する方法ありませんか?

358 名前:デフォルトの名無しさん [2007/07/25(水) 14:29:55 ]
double d;
char c[100];
string s;

sprintf(c,"%f",d);
s=(string)c;

359 名前:デフォルトの名無しさん [2007/07/25(水) 14:32:30 ]
>>358
ありがとうございます。
やはりこの方法しか無いんですね。
itoa()みたいな便利なのあればいいなぁと思ってググったんですが
見つけられませんでした。

360 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 14:36:54 ]
sprintfの方が数倍便利だと思うが

361 名前:デフォルトの名無しさん [2007/07/25(水) 14:38:39 ]
string dtos(double d){ char c[200];sprintf(c,"%f",d);return (string)c;}

これを先頭へコピペして仕え

362 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 14:40:55 ]
>>359
itoa()と違って小数点以下何桁、とか指定することが多いと予想されるからな

363 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 14:46:36 ]
>>356
そうなんですか
ありがとうございます


364 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 14:51:02 ]
とりあえずお約束で
つ std::stringstream
つ boost::lexical_cast
つ boost::format

365 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 14:58:19 ]
error C2027: 認識できない型 'name::B' が使われています。
とのエラーで苦しんでいます。よろしければ助言お願いいたします。

==B.h file=========================================
#include A.h

namespace name {

class B
{
public:
A_Base* const getA_Base() const { return m_a; }
private:
A_Base* m_a;
};

} // name
=================================================
↓続く

366 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 14:58:55 ]
==A.h file=========================================
namespace name {

class B;

class A_Base
{
protected:
B* const getB() const { return m_b; }
private:
B* m_b;
};

class A_Deriv
{
public:
void func() { getB()->getA_Base(); }
};

} // name
=================================================



367 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 15:00:44 ]
A_Deriv::func()を実行すると
error C2027: 認識できない型 'name::B' が使われています。
とのエラーが出てきてコンパイルできません。
どうか助言の方、よろしくお願いいたします。

368 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 15:02:58 ]
A_Derivは
class A_Deriv : public A_Base

です、記述ミスですすみません。

369 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 15:09:31 ]
>>364-368
A.h を頭から順に読んでいったコンパイラさんは、
メソッド B::getA_Base() の存在を知ることができない。



370 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 15:16:33 ]
クラス定義の中で関数を定義すると、
クラス定義の直後にinline付きで定義されたものとして扱われる。
つまりA_Derivはこう書いたのと同じに扱われる。
class A_Deriv : public A_Base
{
public:
void func();
};
inline void A_Deriv::func() { getB()->getA_Base(); }
ところが、この時点ではclass B;という前方宣言しかないため、
Bに関する具体的な情報がわからない。それで367のエラーになってしまう。

解決するには、A_Deriv::funcの定義をBの定義より後に回せばいい。
例えば、A.hとB.hをインクルードするcppファイルでA_Deriv::funcを定義したり、
A_BaseとBを同じヘッダで定義して、そのヘッダの一番下に
インラインでA_Deriv::funcを定義するなどの方法がある。

371 名前:365 mailto:sage [2007/07/25(水) 16:17:52 ]
>>369
>>370
早速の返答ありがとうございます。

かき方がとても悪かったです、A_Deriv::func()は実際はcppの方に実装してあります。

そして、A_Deriv::func()の実装したcppでのincludeをA.h B.hともにして通りました(A.hのみincludeしていた状態でした)

とてもバカなミスでした。お手数おかけしました。どうもありがとうございました!


372 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 18:01:38 ]
>>353
どこのGCCの話をしてるんだ?
Win以外じゃ主流なんだが・・・


373 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 18:05:11 ]
>>372
かわいそうな子に触らないで

374 名前:353=372 mailto:sage [2007/07/25(水) 18:22:02 ]
つまらん。もっと面白い突っ込みしろよ

375 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 19:01:38 ]
質問なんですが、配列には最後の要素に必ずナル文字(\0)が
入らないといけないんですか?

376 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 19:05:27 ]
文字列なら



377 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 19:08:49 ]
>>375
ぬるぽ


文字じゃなければ別に\0入ってなくていい。

文字列だと文字の終わりがわからんから。

文字表示するとき、1個ずつ文字を調べて'\0'まで描画するみらいなルールがあるの


378 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 19:19:54 ]
みらいなみらいなけーの

379 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 10:13:10 ]
らめぇー

380 名前:デフォルトの名無しさん [2007/07/26(木) 11:42:25 ]
VC.NET2003で

mkstemp()

が使いたいのですが、どうしたらいいでしょうか?

381 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 11:59:03 ]
>>380
それは諦めて、標準ライブラリ関数のtmpnamやtmpfileを使う。

382 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 12:02:02 ]
探せばwin32版の実装も転がってるんじゃないのか

383 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 12:12:44 ]
>>382
つCygwin
VC++で使えないだろうけどね。

384 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 15:14:57 ]
エラーチェックが甘いけど、自作するならこんな感じかなぁ。

#include <windows.h>
#include <sys/stat.h>
#include <io.h>

int mkstemp(const char *templ) {
 char *buffer;
 DWORD length;
 char filename[MAX_PATH];

 length = ::GetTempPathA(0, NULL);
 buffer = (char *)malloc(length);
 GetTempPathA(length, buffer);

 if (GetTempFileNameA(buffer, templ, 0, filename) == 0) {
  free(buffer);
  return -1;
 }

 free(buffer);
 return open(filename, _S_IEXEC);
}

385 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 15:19:57 ]
すいません、生徒5人で3科目(国語・数学・英語)の点数を2次元配列に読み込んで、
その最高点と平均点を求めるプログラムを書いたのですが、なぜか平均点がうまく出ません・・・。

どこが悪いのでしょうか。

kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/4757.txt

386 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 15:30:16 ]
printf("[国語]平均点 : %d\n", ave[i]); ここの%d



387 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 15:35:23 ]
>>386
・・・・・orz

すいませんホントありがとうございます・・・。自分ではなかなか気づかないものですね・・・。

388 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 15:39:47 ]
>>387
普通のコンパイラなら警告を出してくれると思うのだが。

389 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 15:40:14 ]
え?printfだぜ?

390 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 15:42:47 ]
--
for (i=0; i<3; i++) {
switch (i) {
case 0 : printf("[国語]最高点 : %d\n", max[i]);
--
激しく間が抜けたコードだな。そこまでループに拘るなら文字列も動的に作ればいいものを。

391 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 15:43:53 ]
>>389
え? 今時出せないコンパイラなんてあったの?
すまん、私が物を知らないらしい。

392 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 15:44:51 ]
>>391
じゃあ、その出すコンパイラと出る例をあげてくれないか。

393 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 15:46:18 ]
gcc -Wallで警告でるよ

394 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 15:48:18 ]
gccはputsに置き換える件といい、余計なお世話が多いな。
この文字列が変数だったら検出できんのかね?

395 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 15:49:35 ]
static char const * const subjs[] = {"国語", "数学", "英語",};
for (ic = 0; ic < sizeof(subjs) / sizeof(* subjs); ++i) {
printf("[%s]最高点:%d\n", subjs[ic], ave[ic]);
}
とか? そこまで凝らなくても良さそうだが。
#でもそれならループにしなくてもって話になるか。

396 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 15:50:33 ]
gccはprintf()を知っているから、警告を出すし、場合によっては
puts()などに置換さえするが、gcc以外でそういうことをやる
コンパイラを俺は知らないな。
昔はそういうのはlintのやる仕事ということになっていた。



397 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 15:51:09 ]
>>394
iccも同じようなことしてきたよ。勿論変数なら検出できないだろうけど、フォーマット文字列を
動的生成する香具師もそうそういないから(いてもその場合どうせトリッキーだし)実質問題なかろう。

398 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 15:51:53 ]
>>395
文字列のリストなら、最後に番兵のNULLをつけるほうが俺は好き。
そのほうがコードが綺麗になるしリンケージを超えてもおk。

399 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 15:52:26 ]
なるほど、gccは出るんだね。
stringオブジェクトに%sも出るのかなー、試してみるか。

400 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 15:53:27 ]
>>397
scanf()系だと、*の働きがprintf()と違うから、動的にフォーマット文字列を
生成したくなることは案外多い罠。

401 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 15:53:52 ]
>>398
僕も君が好きだよ

402 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 15:54:30 ]
>>398
その場合、配列要素数に使えない。
>395の方法なら、double ave[sizeof(subjs) / sizeof(* subjs)]という使い方もできる。
つまり、教科数に依存するマジックナンバーを全廃できるわけで。
#そこまで凝らなくても云々

403 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 18:00:41 ]
>>402
この例のような線形探索をするだけなら番兵で十分で、配列要素数は不要だし、
マジックナンバーも要らないって話でしょ

404 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 18:14:33 ]
>>384
open()の第二引数が抜けてるし、テンポラリファイルをclos()しても削除されない
んじゃないか

405 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 19:33:50 ]
>>402
sizeof subjs / sizeof *subjs - 1

406 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 19:35:16 ]
って、リンケージの問題もあったのか。



407 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 19:56:22 ]
グローバル変数のフラグが沢山あるんですが、
どうにか纏めたいんですがどう修正したらよいか迷ってます。
Singletonで状態を返すクラス作ろうかなとか思ったり
単に構造体に纏めようかなと思ったり。

みなさんはどうしてますか。

408 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 20:09:05 ]
unsigned int とかの変数一つに詰め込んで、ビットシフトのマクロで取り出す

409 名前:155 mailto:sage [2007/07/26(木) 22:38:49 ]
C++でExcelが使えるかどうか質問していた者です。
なんとか辿り着いたのが
ttp://www.ujasiri.com/prglib/vc/excel/vc_excel.html
このサイトなのですが、時間が無く、サンプルのエラー外しで一杯一杯orz
私はDirectXのゲームに対しての作成サポートツールや、ゲーム自体のデータをExcel(のデータ形式)からやり取りしようと考えております。
他の手段で解説しているサイトが見つからないのですが、ここのサイトに書かれていることで宜しいのでしょうか。
Excelを持っていない人がゲームをしても問題ないかとか、読み込みが非常に重いとか心配しています。


410 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 22:46:09 ]
ExcelがインストールされていないPCだとCreateInstanceが失敗する。
少なくともそこのエラーチェックだけはきちんとしておけ。

411 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 22:53:35 ]
>>408
ビットフィールド使えよ

412 名前:155 mailto:sage [2007/07/26(木) 22:58:41 ]
>>410
おろ、ということはユーザにExcelデータを読み込ますようなゲームは作るべきではないということでしょうか。
検索しても解説しているサイトが中々見当たらないのはそのためか・・orz

413 名前:デフォルトの名無しさん [2007/07/26(木) 23:18:28 ]
412
CSVやテキストや独自バイナリでまず作っておけよ

414 名前:デフォルトの名無しさん [2007/07/26(木) 23:19:08 ]
なぜエクセルにこだわるのかがわからない
動作が鈍くなるだろ

415 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 23:22:40 ]
 おかげで騒ぎまくったお

⊂⌒ヽ          (⌒⊃
  \ \  /⌒ヽ  / /
 ⊂二二二( ^ω^)ニニ二⊃
     \ \_∩_/ /
      (  (::)(::)  )
       ヽ_,*、_ノ  ブーン
   ///
 ///

416 名前:155 mailto:sage [2007/07/26(木) 23:34:05 ]
>>413-414
パーツのステータス管理(耐久度とか説明文)をExcelを使えば編集がしやすいかと思って実装しようとしています。
なるほど、エクセルから独自形式へのコンバートをこちらでしてしまえば、
ユーザは独自形式を読み込むだけなのでExcelが無いと動かないような症状にはなりませんね。




417 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 23:37:11 ]
>>416
その「編集」をするのはユーザなのか、お前さんなのか、プログラムなのか、どれだ

ユーザに編集させるんなら、Excelがインストールされているのが当然前提になる
自分なら、CSVなりTSVなりプログラムで扱いやすい形式でセーブしてやれば
いいだろ
読み込む仕事はずっと楽で高速だ

プログラムが内部的に扱うだけなら、バイナリでもいい

418 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 01:16:53 ]
>>416
Excelからの読み込みようデータでテキスト(もしくはバイナリ)出力を
VBAで書いてもいいんじゃない?
セルの値をファイルに出力するくらいならVB未経験でも
ちょっと勉強すればできるようになると思うよ。

419 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 01:44:55 ]
Excelのバージョンで動き違うし改ページ周り操作したら落ちるしデータ転送遅いし
xlsを書き出す必要がある時以外は使いたくないな

420 名前:デフォルトの名無しさん [2007/07/27(金) 09:08:25 ]
VC2005 Expressを使っています。
一つのプロジェクトxでa.c, a.hを作成してそれらは同一フォルダのstdafx.hを読み込んでいます。
このa.cとa.hをそのままに、プロジェクトyでつかいたかったのでプロジェクトyにドラッグアンドドロップしてプロジェクトに追加して、
プロジェクトy特有のstdafx.hを作成してビルドすれば、
プロジェクトxではプロジェクトx内のstdafx.hを利用して、プロジェクトyではプロジェクトy内のstdafx.hを利用すると夢を見たのですが、
どちらのプロジェクトのa.cもプロジェクトxのstdafx.hを読んでいるようです。
include文に相対パスを書いておけば上のような利用法ができるとおもっていたのですが何とかする方法を教えてもらえないでしょうか。
a.cとa.hに手を加えずに双方のプロジェクトで使えるようにしたいのです。
具体的にはプロジェクトxはダイナミックリンクライブラリのプロジェクトなので#define DLLEXPORT __declspec(dllexport)をつけたくて、
プロジェクトyはスタティックリンクライブラリのプロジェクトなので、#define DLLEXPORT __noopをつけたいのです。

421 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 09:26:18 ]
stdafx.hはプリコンパイルヘッダーのためにあるんだから
共通のものを読まないと意味が無いんだよ。
stdafx.hの中で差があるものを別のヘッダかソースに入れてしまえば。
もしくはプリコンパイルヘッダーの使用をやめてstdafx.hのインクルード自体やめるとか

422 名前:デフォルトの名無しさん [2007/07/27(金) 10:37:40 ]
えと、↑420は、
C:\projectXXX\a.cがあって、C:\projectXXX\a.hでインクルードしているC:\projectXXX\b.hがあり、
プロジェクトxで利用されているとプロジェクトxではb.hはC:\projectXXX\b.hが読み込まれ、
projectXXX
 ソースファイル
  a.c(C:\projectXXX\a.c)
 ヘッダーファイル
  a.h(C:\projectXXX\a.h)
  b.h(C:\projectXXX\b.h)
プロジェクトyではC:\projectXXX\a.cと、C:\projectXXX\a.hを利用し、
別途C:\projectYYY\b.hを用意しておけばプロジェクトとしての相対パスだからb.hはC:\projectYYY\b.hが読み込まれると思ってたんですが
projectYYY
 ソースファイル
  a.c(C:\projectXXX\a.c)
 ヘッダーファイル
  a.h(C:\projectXXX\a.h)
  b.h(C:\projectYYY\b.h)
コンパイル時、b.hはC:\projectXXX\b.hが読み込まれています。
includeはプロジェクトに入れているファイルから読んでくれるとおもっていたら
ファイルシステムの相対パスでプロジェクトにいれていないファイルを読んでいるので
これをプロジェクトに入れているファイルを使ってほしいという意味です。

>>421
プリコンパイルヘッダーの知識がほとんどないので勉強してみます。

423 名前:デフォルトの名無しさん [2007/07/27(金) 10:55:42 ]
C言語で「yのx乗」って式を書く場合どうすればいいですか?

424 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 11:02:04 ]
>>423
www.linux.or.jp/JM/html/LDP_man-pages/man3/pow.3.html

425 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 11:03:06 ]
>>423
x**y

426 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 11:04:06 ]
>>425
yのx乗だった
y**x



427 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 11:08:01 ]
ネタ回答で訂正レス入れる奴カッコワルイ

428 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 11:09:49 ]
ワロタ

429 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 11:10:22 ]
ウッサイ

430 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 11:19:25 ]
C++ならこれで
#include <cstdio>
#include <cmath>

class Double {
double val;
public:
Double(const double foo) : val(foo) {}
double operator^(const double foo) const {return pow(val, foo);}
};
こう書けるのだが。
std::cout << (Double(2.56) ^ 0.5);
#演算子の優先順位の都合で括弧が必要なのが切ないw


431 名前:デフォルトの名無しさん [2007/07/27(金) 11:21:27 ]
>>424
即レスありがとうございます。
mathが必要でしたか・・・for文でなんとかするかorz
>>425-426
ぷぎゃーwww
ちょっと信じかけた俺、涙目ノシ

432 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 11:29:50 ]
C++で大容量CSVファイル(1GBくらいのでっかいやつ)を読み込みたいのだが、
今はwhileでget使って1バイトずつ読み込んでるんだが、いかんせん時間がかかって仕方ない
もっと高速にやる方法って何かあるかな?
初心者なりに考えてみたけれどさっぱり思いつかない・・・

433 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 11:32:55 ]
1GBなんて素で読んでも時間かかると思うが、getって何かな?
CSVならまず1行ずつ読んでみては。

434 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 11:35:28 ]
>>432
csvなら1行ずつ読むだろ……常考
まさか読み込んだ結果も丸ごとオンメモリで保持してないよな。
メモリ量にも拠るが、場合によってはデータの持ち方の工夫も必要かもよ。

435 名前:デフォルトの名無しさん [2007/07/27(金) 11:36:12 ]
WindowsXP + BCB5 + FAT32です。

ファイルに実際には書き込むことなく、希望の長さのファイルを作る方法はないでしょうか。

chsizeは拡張部分を0で埋めます。
seekg + fwrite でできるかもと思いましたが、長さ0の書き込みでは
ファイルが期待した長さになりません。

436 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 11:49:00 ]
>>432
文字列処理の部分も疑ってかかるべきだが、IOの部分で言うと
移植性を捨ててmmap()やCreateFileMappingの類を使うのが一番速い。
C++の標準ライブラリだけでやるなら、
・istreamではなくstreambufを使う。1文字読む版のget()に対応するのは
 sbumpc()だ。
・streambuf::pubsetbuf()であらかじめ巨大なバッファを設定する
ことで多少はマシになるだろう

>>434
CSVってカラム内改行がLFで行末はCRLFだろ
少なくともstd::getline()は役に立たないんじゃないか



437 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 12:06:11 ]
>>435
CreateFile() -> SetFilePointer() -> SetEndOfFile()
で出来るはずだが、多分chsize()でも同じことをやっているはずで、
普通にやればゼロ埋めされると思う。
NTFSならいわゆるSparse Fileを作れた気もするがどうだったかな。
FAT32ではだめだろう。

438 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 12:26:22 ]
質問です
最近勉強はじめたんですけど本やらサイトなど見ながらやってます
で、プログラムの書き方なんですが
int main(void)

void main()
ってのがあるんですけどどう違うのでしょう?
一般的にどっちが使われてるのですか?

439 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 12:29:36 ]
intのほう

440 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 12:29:59 ]
>>436
csvファイルと聞いて、カラム内改行をサポートしたフォーマットを想定する香具師がどれだけいるだろうか。
普通は、1Row読めると考えていいんでない?
#大容量、速度優先と聞いた段階で1行=1Rowと想定した漏れ。

441 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 12:31:37 ]
>>440
ttp://www.rfc-editor.org/rfc/rfc4180.txt

442 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 12:35:24 ]
>>439
ありがとうございます
そっちでやってみます
でも結局意味は同じという事でしょうか?

443 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 12:37:46 ]
>>441
つまり、セル内改行はCRLFだということか。
何だ、fgets()でいいじゃん。

444 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 12:39:27 ]
>>442
いいえ。後者は規格不適合です。

445 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 12:40:16 ]
>>443
行末がCRLFで
セル内改行はCR「または」LFだ。よく読めよ。

446 名前:現実見ない人は気楽でいいね mailto:sage [2007/07/27(金) 12:45:14 ]
なるほど、MSExcelやOpenOfficeCalcではRFC勧告に則っていないファイルを出力しているわけだ。
#see TEXTDATA

それはそれとして、
>>445
CRやLFはDQUOTEで括らないといけないという記述はあるけど(see escaped)、
line breakがCRまたはLFだという記述はどこ?



447 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 12:46:14 ]
>>444
そーゆうことですか
ありがとうございます


448 名前:445 mailto:sage [2007/07/27(金) 12:55:53 ]
>>446
このRFCは2005年に出来た新米だからな、MSのOffice従っているわけがないw

セル内改行については、解釈方法をRFCでは規定してないっぽいな。
単にCRだのLFだのを入れられるがその場合はクオートしろってだけ。






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

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

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