開発環境 |
Microsoft Visual C++ 2010 Express (SP1) |
実行環境 |
Microsoft Windows XP Home Edition (SP3) |
プロジェクトの種類 |
Win32 コンソール アプリケーション |
プロジェクト名 |
test |
アプリケーションの種類 |
コンソール アプリケーション |
追加のオプション |
空のプロジェクト |
4GB以上のファイルを_tstatに渡すとエラーになる。
test1.c
#include <stdio.h>
#include <tchar.h>
#include <Windows.h>
int _tmain()
{
static char acBuffer[1024 * 1024]; // staticにしないとスタックオーバーフロー
FILE* pFile;
size_t sizeWrite;
int i;
if (_tfopen_s(&pFile, _T("test.bin"), _T("wb")) != 0) {
_ftprintf(stderr, _T("error: _tfopen_s\n"));
return 1;
}
SecureZeroMemory(acBuffer, sizeof acBuffer);
for (i = 0; i < 2048; i++) {
sizeWrite = fwrite(acBuffer, sizeof acBuffer[0], _countof(acBuffer), pFile);
if (sizeWrite != _countof(acBuffer)) {
_ftprintf(stderr, _T("error: fwrite\n"));
return 1;
}
}
_fcloseall();
return 0;
}
test2.c
#include <tchar.h>
int _tmain()
{
struct _stat stat; // _stat64i32
struct _stati64 stati64; // _stat64
int iRet;
// ファイルサイズが4GB未満
iRet = _tstat(_T("test2GB.bin"), &stat);
if (iRet != 0) {
_ftprintf(stderr, _T("error: _tstat %d\n"), iRet);
return 1;
}
_tprintf(_T("%#x %u\n"), stat.st_size, stat.st_size);
// ファイルサイズが4GB以上
iRet = _tstati64(_T("test4GB.bin"), &stati64);
if (iRet != 0) {
_ftprintf(stderr, _T("error: _tstati64 %d\n"), iRet);
return 1;
}
_tprintf(_T("%#llx %llu\n"), stati64.st_size, stati64.st_size);
return 0;
}
実行
0x80000000 2147483648
0x100000000 4294967296
最終更新:2012年09月01日 16:48