2016年01月15日

Visual C++で2GB超のファイルを取り扱う方法

先日、仕事で作っていたWindows向けのツールで、3GBのファイルを扱う必要が出てきました。
C言語の標準のファイル入出力関数を使っていたプログラムだったのですが、どんだけ多くの改修を加えなければならないのかとビクビクしていたのですが、よくよく調べてみると、それほど難しくなかったみたいです。

というのも、ただ単にファイルを開いて、ファイルを入出力して、ファイルを閉じるくらいであれば、これまで通り fopen(), fgets(), fread(), fputs(), fwrite(), fclose() などの関数を使っておけばよいみたいで。

どんなときに注意が必要かというと、ユーザープログラム側とファイルポインタの現在位置情報のやりとりが生じるようなとき。
例えば、fseek() や ftell() を使う場合ですね。

fseek() は、ファイルポインタの現在位置を任意の位置に移動します。ところが、fseek()の引数はlong型です。Windowsのlongは、32bit CPUであっても64bit CPUであっても、32bit整数型ですので、ファイルポインタは 0〜231-1 の範囲でしか移動できません。
231-1 を超える位置にファイルポインタを移動させたければ、_fseeki64()を使うことになりなります。

ftell() は、ファイルポインタの現在位置を返す関数です。ところが、ftell()の戻り値はlong型です。
2GB超のファイルポインタの位置を取得したい場合は、_ftelli64()を使うことになります。

先のツールでは、ファイルサイズを得るために、


【2/17追記】【注意】下のような方法でファイルサイズを求めることを奨励しているサイトは多いのですが、fseek()でファイル終端位置にシークする操作は結果が保証されないことにされており、このようなコードを記述してはいけないそうです。fstat()を使うのが正しいやり方とのこと。

fseek(fp, 0, SEEK_END);
long fsize = ftell(fp);
fseek(fp, 0, SEEK_SET);


というようなことをやっておりましたので、この部分を


【2/17追記】【注意】下のような方法でファイルサイズを求めることを奨励しているサイトは多いのですが、fseek()でファイル終端位置にシークする操作は結果が保証されないことにされており、このようなコードを記述してはいけないそうです。
_fseeki64(fp, 0, SEEK_END);
__int64 fsize = _ftelli64(fp);
_fseeki64(fp, 0, SEEK_SET);

に書き換えました。
ついでに、fsizeを表示するために printf("%ld", fsize); としていた箇所は、printf("%I64d", fsize); に差し替えです。

ちなみに、2GB以下のファイルに対しても、_fseeki64() や _ftelli64() は使用可能ですので、他の処理系への移植予定がなく、将来的に2GB超のファイルを扱う可能性があるならば、最初から _fseeki64() や _ftelli64() を使うようにして置いた方が良さそうですね。


posted by ayacy at 00:00 | Comment(0) | TrackBack(0) | プログラミング

2016年01月14日

ノートPCにLinux Mintを入れたけど、iPhoneからのデータ取り出しってできるのかな

去年、VAIO type PのWindowsを消して、Linux Mintを入れました。その後は、メインPCへのリモートデスクトップ用として活用できているのですが、ちょっと不安なことが。

というのも、正月で親戚宅へ行ったとき、iPhoneで録画した動画を送りたいんだけど、メールでもLineでも送れなくて、どうしたらよいだろう?と相談を受けたときのこと。
巨大な動画を他者へ送りたいのであれば、一度パソコンへデータを移し、パソコン上からデータの送信を行うのが手っ取り早いと言えます。

これまでであれば、VAIO type Pを持ち歩いておき、iPhoneなりAndroid携帯をUSB接続してデータを取り出していたのですが、それが当たり前にできていたのは、Windows PCだったから。Linuxでもそれと同じことができるのかは、わかりません。

というわけで、試しにLinux Mintを入れたVAIO type PにiPhone5sをUSBで接続してみました。

lm_iphone.jpg

デスクトップ上の「ホーム」アイコンをダブルクリックし、ファイルマネージャを表示させると、iPhone5sに付けた名前が普通に表示されていました。
そこのアイコンをダブルクリックすると、マウントが自動的に行われ、iPhone5s内のディレクトリが表示され、写真屋動画データの抜き出しを行うことができました。
(初回実施時は、マウントの際に、iPhone5s側で、接続しているデバイスが信頼できるデバイスであることを応答しないといけません)

普通にWindowsの時と同じように使えるというのはうれしいですね。


続きを読む
posted by ayacy at 00:00 | Comment(2) | TrackBack(0) | PC

2016年01月13日

iPhone5sのバッテリーがとてもヤバい

docomoでiPhone5sの取り扱いを開始し始めたときから使っているiPhone5sですが、バッテリーの性能が著しく落ちているみたいです。
バッテリー残量50%なのに、突然電源が落ちて、充電が必要な状態となってしまう。
で、コンセントに繋ぐと、残53%くらいから充電が開始される。
半日に1回程度の頻度で充電しないとマズイ。

去年の冬くらいには、バッテリー残量40%程度で突然電源が落ちることがあったのですが、ちょっとだけグレードアップ(ダウン?)した感じ。

夏になって、バッテリーの劣化が軽減されたような気がしてきたので、去年は特に対処しなかったのですが、冬になって再発するとはなぁ。

まぁ、バッテリーという物自体、周囲の気温が低いと、こういった劣化したかのような状況がよく生じるとのことなのですがね。

というわけで作戦。

  1. アップルストアにバッテリーの修理(交換?)を依頼する。
  2. 2月頃に発売が予定されていると憶測されている、iPhone6cを買ってみる。
  3. いっそのこと、iPhone6sを買っておく。
  4. iPhone7登場まで待つ。

実は、買い換えを渋っている理由として、先日iPhone5s用のソフトケースを買ったばかりという事情もありますね。もうちょっと使ってからでないと、もったいないような気がするし、そう思っているうちに暖かい時期がやってきそう。(春になれば、バッテリー劣化が少し軽減されるので)


posted by ayacy at 00:00 | Comment(0) | TrackBack(0) | スマホ