ページ 11

ファイルサイズの取得

Posted: 2012年8月11日(土) 12:10
by shiro4ao
ファイルサイズを取得したくて以下の様なコードを書いたのですが、
2.1GBくらいのファイルまではうまく取得できるのですが
3.1GBのファイルを開いてみたら-1095716864と出てきて、
明らかにうまく取得できませんでした。
どこがおかしいのでしょうか・・・・

コード:

#include    <stdio.h>
#include    <conio.h>
#include    <windows.h>

DWORD FileSize(char *name){
	HANDLE hFile;
	DWORD size;
	hFile = CreateFile(name , GENERIC_READ, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
	size = GetFileSize( hFile, NULL );
	CloseHandle( hFile );
	return size;
}

int main(int argc,char* argv[]){
	printf("size=%d",FileSize(argv[1]));
	getch();
}

Re: ファイルサイズの取得

Posted: 2012年8月11日(土) 12:24
by softya(ソフト屋)
printfが符号付きの%dだからです。%uを使ってください。
intとDWORDは同じ32bitで、int型なら最上位ビットは符号部です。

前トピックもお忘れなく。
「【雑談】シェアウェアになるには • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/viewtopic.php?f=3&t=11255

Re: ファイルサイズの取得

Posted: 2012年8月11日(土) 12:44
by shiro4ao
前回のトピック、雑談ですが、一応解決にしておきました。
ありがとうございます。

%uで出力させたら正しい値が出てきました。
なかなか厄介ですね。
すみません。

Re: ファイルサイズの取得

Posted: 2012年8月11日(土) 12:48
by softya(ソフト屋)
shiro4ao さんが書きました:前回のトピック、雑談ですが、一応解決にしておきました。
ありがとうございます。

%uで出力させたら正しい値が出てきました。
なかなか厄介ですね。
すみません。
整数型の数値の精度とかは基本的な問題ですので、アプリを作る上でちゃんと勉強されたほうが良いでしょう。
「整数型 - Wikipedia」
http://ja.wikipedia.org/wiki/%E6%95%B4% ... 0%E5%9E%8B
「BohYoh.com-C/C++ FAQ 整数型が表現できる値の範囲を教えてください。」
http://www.bohyoh.com/CandCPP/FAQ/FAQ00046.html

あと4GBオーバーを考慮していないは今のソフトとして問題がある気がします。

Re: ファイルサイズの取得

Posted: 2012年8月11日(土) 13:23
by shiro4ao
かなり問題が多いことは認識しています。
大きなファイルサイズだと不具合が起きたり、ゼロ除算が平気で起こったり、
64bit時代にもかかわらずWOW64で動いてたり。
修正しないといけない部分が多すぎます。

シェアウェアの計画はもろくも崩れ去ったので(笑)
ちゃんと動くアプリケーションを作れるように頑張ります。

Re: ファイルサイズの取得

Posted: 2012年8月11日(土) 14:19
by softya(ソフト屋)
WOW64で動いているのは問題ないと思います。
と言うより、OSとして32bit/64bit混在の現在では64bit専用はそれなりのスピードの優位性が無い限り作る意味は無いと私は思います。