C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: fwriteについて


(過去ログ 55 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■30898 / inTopicNo.1)  fwriteについて
  
□投稿者/ 凪 (10回)-(2009/01/08(Thu) 18:27:17)

分類:[C/C++] 

WinXP
VC++2003

fwriteについて質問させてください。

只今VC++を勉強中なのですが、ファイル操作で詰まっています。
データの書き出しの際、fwriteを使うやり方があると思いますが、どのサイトを見ても
イマイチ使い方がハッキリ載っていません。

fwrite(バッファ, サイズ, 項目数, ハンドラ)

とありますが、サイズとは何のサイズでしょう?また、項目数とはなんの数でしょう?
バッファとハンドラは勿論わかるのですが、間の2つがわからず困っています。

あるサイトでは「サイズと項目数はぶっちゃけ適当でいい」とあったり「サイズは1固定でいい」「項目数は1固定でいい」とあったりします。

ところが実際に出力してみると、サイズと項目数を変える事で出力されるデータが違ってしまいます。

今、テストで50000文字のデータを出力しようとしているのですが、間の数字をどういじっても途中までしか出力してくれません。

下記をどのようにしたらよいのでしょう?

vector<char> chr;
for(int i=0; i != 50000; i++)
chr.push_back('a');

char* c;
*copy(chr.begin(),chr.end(),c) = '\0';

FILE * fp;
fp = fopen("a.xxx","ab");
fwrite(c, ●●●●,●●●●,fp);
fclose(fp);

以上、宜しくお願いします。


引用返信 編集キー/
■30899 / inTopicNo.2)  Re[1]: fwriteについて
□投稿者/ .SHO (524回)-(2009/01/08(Thu) 18:32:02)
No30898 (凪 さん) に返信

> fwrite(バッファ, サイズ, 項目数, ハンドラ)

> 今、テストで50000文字のデータを出力しようとしているのですが、間の数字をどういじっても途中までしか出力してくれません。

サイズ×項目数=50000 にすればいいです。
引用返信 編集キー/
■30900 / inTopicNo.3)  Re[1]: fwriteについて
□投稿者/ 774RR (281回)-(2009/01/08(Thu) 18:42:11)
なんだかむちゃくちゃやってるぞ! fwrite 以前の問題があるのが動かない原因なのだ。

とりあえずそこはおいといて
fwrite のマニュアルは見て、それでも理解できない、だから質問、ってのはいい心がけだ。
マニュアルも見ないで質問する奴が多い中で見込みあるぞ!

サイズ:今扱いたいデータの大きさ
個数:その個数
っつーことで、たとえば以下の例

例1:
fwrite("abc", sizeof(char), 3, f); // 文字を3個出力する

例2:
struct coord {
  int x;
  int y;
};
coord p;
fwrite(&p, sizeof(coord), 1, f); // 構造体をバイナリ形式で1個出力する

fwrite は指定された場所から size*count バイト長を出力するわけだ。
size と count を逆にしても fwrite の挙動は同じになるので、そういう説明がまかり通っている。
ソースコード上での意味はやはり「1個のデータの大きさ」*「それが何個」なのだよ。

引用返信 編集キー/
■30911 / inTopicNo.4)  Re[1]: fwriteについて
□投稿者/ επιστημη (1497回)-(2009/01/08(Thu) 20:17:52)
επιστημη さんの Web サイト
> char* c;
> *copy(chr.begin(),chr.end(),c) = '\0';

領域確保してねー!

引用返信 編集キー/
■30917 / inTopicNo.5)  Re[2]: fwriteについて
□投稿者/ 凪 (11回)-(2009/01/08(Thu) 21:52:51)
皆様

ご回答有難うございます。

返事遅くなってすいません。

.SHOさん
有難うございます。お陰様で上手く出力できました。

774RRさん
お褒めの言葉有難うございます^^;
やっぱり勉強は一つ一つ苦労しないと未につかないですよね(笑)
そしてまたまたわかり易い解説を有難うございました。
どのサイトより理解できた気がします。

επιστημηさん
ホントですね^^;
慣れるまでまたやらかしそうです…


皆様、初心者の基本的な質問にお付き合い頂きまして本当に有難うございます。
ここは素晴らしいサイトだと思います。
また詰まった時はどうぞ宜しくお願いしますm(__)m
解決済み
引用返信 編集キー/
■30918 / inTopicNo.6)  Re[3]: fwriteについて
□投稿者/ επιστημη (1498回)-(2009/01/08(Thu) 23:50:57)
επιστημη さんの Web サイト
2009/01/08(Thu) 23:51:50 編集(投稿者)

> 慣れるまでまたやらかしそうです…

てか領域確保しなくていいんじゃね?

chr が vector<char> なら
fwrite(&chr[0],サイズ,個数,fp);
でイケるはず。

解決済み
引用返信 編集キー/
■30920 / inTopicNo.7)  Re[1]: fwriteについて
□投稿者/ ....... (1回)-(2009/01/09(Fri) 09:24:49)
No30898 (凪 さん) に返信

fwriteの戻り値も確認しましたか?

fwrite は、実際に書き込まれた完全な項目の数を返します。
      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
とありますので、単純に「項目数は1固定でいい」は間違いです。

「指定サイズの物を項目数書き込んで下さい。fwriteは書き込んだ項目数を返します」って事なのだから。。

引用返信 編集キー/
■30921 / inTopicNo.8)  Re[2]: fwriteについて
□投稿者/ επιστημη (1499回)-(2009/01/09(Fri) 09:55:50)
επιστημη さんの Web サイト
2009/01/09(Fri) 12:18:08 編集(投稿者)

> 単純に「項目数は1固定でいい」は間違いです。
> 「指定サイズの物を項目数書き込んで下さい。fwriteは書き込んだ項目数を返します」って事なのだから。。

裏返せば「全部ちゃんと書けたか否か」以外に興味がないなら
「項目数は1固定でいい」ことになるですね。

# fwriteを使わないサンプル
# つ http://blogs.wankuma.com/episteme/archive/2009/01/09/166002.aspx

引用返信 編集キー/
■30925 / inTopicNo.9)  Re[3]: fwriteについて
□投稿者/ 774RR (282回)-(2009/01/09(Fri) 12:38:51)
そう、その辺 fwrite の使い方が難しいあたりなんで・・・・

nn=size*count; としておいて
何バイト書けたか?が気になるプログラマーは fwrite(p, 1, nn, f); として使いたい
(この場合、一部書き込め、一部書き込めていない、不完全なデータができちゃう)
正しく書けたか?しか気にしないのなら fwrite(p, nn, 1, f); でいい

本来の fwrite の返却値の意味、「何個書けたか」は実際のプログラムでは使いづらいことが多くて
良くある解説「サイズか、個数か、どっちかに1を使え」
ってのはある意味正しい戦術なのよね。

# fwrite で struct を直接書き出しちゃうと endian/padding 問題が発生して
# ソースコードは互換でも、データファイルが互換にならないわけだがとりあえず省略

fwrite/fread は指定位置からデータが連続している必要があり、
vector はデータを連続的に保持するので fwrite(&v[0], サイズ, 個数, f) でうまく動くわけなんだが
list はデータを連続に保持しないので fwrite(&l[0], サイズ, 個数, f) はダメちゃん。
つうことで C++ ではコンテナに対して直接 fwrite/fread はあまり好まれなくって
http://blogs.wankuma.com/episteme/archive/2009/01/09/166002.aspx

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -