INASOFT 管理人のひとこと


フリーソフトダウンロードサイト「INASOFT」の管理人 矢吹拓也 が日々の「ひとこと」を語るページです。
2021年1月1日より、旧ブログ(blog.inasoft.org)からお引越ししました。
・INASOFT Webサイト: https://www.inasoft.org/
・管理人のふたこと(長文記事/寄稿文): https://www.inasoft.org/talk/
本業の方のお仕事が再び忙しくなりつつあるので、断続的にしばらく更新が止まることがあります。

目次 | ←前へ / 2016-01-20 00:00 / 次へ→ / 最新へ⇒

■Visual C++ 2010のfwriteの限界?

2016/ 1/20 0:00:00


RSSRSS配信中

https://www.inasoft.org/








先日、お仕事で、後輩の作っているプログラムを見る機会があったのですが、そこで、ちょっと不思議な挙動を見たのでメモ。

Visual C++ 2010で、fwrite() 関数に対して500MB近いバッファを与えて、一気に書き込みをしようとしていたのですが、fwrite() 関数が戻り値0でエラーリターンしていました。errnoを調べると、「Invalid argument」(不正な引数)を示していました。

試しに、次のどちらかを試すと、問題は解消しました。

  • fwrite()に与えるバッファサイズ・書き込みサイズを200MB近くまで下げる。
  • fopen()するときに、modeとして "wb" ではなく "wb+" を与える。
おそらく、Visual C++ 2010 の fwrite() 関数の実装か、その実装で使われている Windows API (WriteFile() APIか何か?) の制限があるのでしょう。一度に書き込める限界があったのかも知れません。

fopen() するときのmodeに"+"を付けると問題が解決する理由もよく分かりませんが、"+"は読み書き兼用のファイルを開くことを意味しており、読み書きのために多くのバッファを確保できる仕組みがあるのかも知れません。

ネット上で検索しても、それっぽい情報が出てこなかったので、ちょっと不思議に思いまして。


あるいは、ハードウェア的に、いわゆる DMA 的なやつが連続して扱えるメモリ量に限界があるとか?そういったものもあるんでしょうか。そこら辺はよく分からないですけどね。





目次 | ←前へ / 2016-01-20 00:00 / 次へ→ / 最新へ⇒


目次の表示:


ブログではないので、コメント機能とトラックバック機能は提供していません。ご質問・ご意見等はメールフィードバックまたはTwitter等からお願いします。いただいたご質問・ご意見などは、この「管理人のひとこと」の記事に追加、あるいは新規の記事にする形で一部または全文をそのまま、あるいは加工させていただいた上で、ご紹介させていただく場合があります。
当サイトでは掲載内容による不具合等に関する責任を持ちません。また、内容の正確性についての保証もありませんので、情報をご利用の際は、利用者の自己責任で確認をお願いします。本ページは公開から1年半後の任意のタイミングで削除される予定です。




2554568 (+0268)[+0573]

Copyright© 2010-2021 INASOFT