• ベストアンサー

ディスクの空き容量を得たい2

下で質問したのですが、画像が貼れなかったので もうひとつトピックを立てましたすいません %d から %llu に変更したところ 無事値は表示されましたが h1.QuadPart の値ではなく h1.LowPart の値が表示されました #include <windows.h> #include <stdio.h> void main() { ULARGE_INTEGER h1; ULARGE_INTEGER h2; ULARGE_INTEGER h3; GetDiskFreeSpaceEx( NULL, &h1, &h2, &h3 ); printf( "h1.QuadPart: %llu\n", h1.QuadPart ); LONGLONG i = h1.QuadPart; printf( "%llu\n", i ); } また、LONGLONG i に 代入して再表示しても やはり h1.QuadPart の値ではなく h1.LowPart の値が代入されていました これはいったいどういうことでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.1

お使いのコンパイラーは何ですか? また、 >h1.QuadPart の値ではなく >h1.LowPart の値が表示されました と書かれているということは、 h1.QuadPart の値とh1.LowPart の値を何らかの方法を使ってご存じである、ということですね。 その、何らかの方法というのを教えていただけますか? ちなみに、私のところ(Borland C++ 5.82)で当該のプログラムを実行したところ h1.QuadPart: 90910289920 90910289920 という結果を得ました。また、dir コマンドの実行結果の最終行で、 2 個のディレクトリ 90,910,289,920 バイトの空き領域 という結果を得ました。 これらの数値が一致しているのは、ご自身の想定と同じでしょうか。

dic2008
質問者

お礼

解答ありがとうございます 使用しているコンパイラはVisualC++6.0で、OSはXP Home Editionです 確認の方法ですが、上の画像で赤で囲ってありますが デバック機能のブレークポイントにて h1の変数の中身を見ました (画質が荒いので見えにくいですが・・・) dir コマンドでは 16,929,587,776 バイトの空きとでました デバックで一時的に止め h1 変数の中身を確認したところ h1.QuadPart = 16,929,587,776 h1.LowPart = 4,043,837,440 とでました この状態で LONGLONG i = h1.QuadPart としたところ i には 16,929,587,776 が代入されましたが (ブレークポイントにて一時的に止め確認) printf にて表示を行うと 4,043,837,440 とでるのです そこがよくわからないのです

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.3

 画像が見ずら過ぎたので(駄目だこりゃ)、補足します。 ・左  VC60  3759531520 ・中央  VC2005  8054498816 ・右  ハードディスク空  8054498816  です。

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

 こんばんは。  VC6.0では無理なのでは?

dic2008
質問者

お礼

VisualC++ 2008 Express にしたところ 無事表示されました ありがとうございました

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ディスクの空き容量を得たい

    現在ディスクの空き容量を得るプログラムを書いている のですが #include <windows.h> #include <stdio.h> void main() { ULARGE_INTEGER h1; ULARGE_INTEGER h2; ULARGE_INTEGER h3; GetDiskFreeSpaceEx( NULL, &h1, &h2, &h3 ); printf( "h1.QuadPart: %d\n", h1.QuadPart ); } としたところ 画像のようにプラスの値が表示できないのです printf の引数の %d でULARGE_INTEGER の値を表示 できるのでしょうか? それともどこかが間違ってるのでしょうか?

  • QueryPerformanceCounter の使い方の間違いの指摘をお願いします。

    Windowsの起動してからの時間を知りたいのです、QueryPerformanceCounterを使っています。 前は、timeGetTimeを使っていたのですが32ビットで47日以上はオーバーフローになってしまうので上のを使うことにしました。 QueryPerformanceCounterの使い方をいろいろ調べて見よう見まねでやってみたのですが、よく分からずtimeGetTimeのように使ったら訳の分からない値を返してきました。 明らかに、自分が間違っていることは分かるのですが、その致命的な間違いが分かりません。 MSDNより BOOL QueryPerformanceCounter( LARGE_INTEGER *lpPerformanceCount // カウンタの値 ); typedef union _LARGE_INTEGER { struct { DWORD LowPart; DWORD HighPart; }; LONGLONG QuadPart; } LARGE_INTEGER, *PLARGE_INTEGER; この時点でいまいちよく分からなかったのですが、使う部分は64ビットなので「QuadPart」だろうと思いました。 LONGLONG型・・・。 理解せずにプログラムを以下のように組みました。 私の理解では、QueryPerformanceCounterはWindowsが起動してからの時間を返してくれるものだと思っています。 #include <stdio.h> #include <windows.h> int main() { LARGE_INTEGER i64; LONGLONG count; QueryPerformanceCounter(&i64); count = i64.QuadPart; printf("LONGLONG=%lld\n" , count); return 0; } 実行結果 LONGLONG=3670653187373 続行するには何かキーを押してください . . . 実際の経過時間 1025500秒 基本がわかってないとは思うのですが、QueryPerformanceCounterが実際に返してる値とWindowsが起動してからの時間を64ビットで取得する方法を教えていただけないでしょうか? よろしくお願いします

  • 値を変数に代入してprintfで表示しようとしてもうまくいきません

    値を変数に代入して、printfで表示しようとしてもうまくいきません。 ソースのどこが悪いか教えていただけないでしょうか? 変数の値を1個ずつ表示する場合は、正常になります。 問題は、1行で表示する場合に1個目の値は出るのですが正常な表示にはなりません。 //ソース開始 #include <stdio.h> #include <windows.h> int main() { LARGE_INTEGER i64,h64; LONGLONG work,h,m,s; QueryPerformanceCounter(&i64); QueryPerformanceFrequency(&h64); //起動時間をミリ秒取得 work = i64.QuadPart*1000 / h64.QuadPart; //時間をhに入れる h = work / 1000 / 3600; //分をmに入れる m = (work / 1000 - h * 3600) / 60; //秒をsに入れる s = work / 1000 - h * 3600 - m * 60; //表示 printf("%d時間%02d分%02d秒\n",h,m,s); printf("%d時間\n",h); printf("%d分\n",m); printf("%d秒\n",s); printf("%d秒\n",work); return 0; } //ソースここまで //実行結果 289時間00分55秒 289時間 55分 54秒 1043754590秒 続行するには何かキーを押してください . . . //理想の表示結果 1行目が以下のようになってほしい 289時間55分54秒

  • スレッドを2つ作って1秒ごとに2つのスレッドが数値を表示するプログラム

    スレッドを2つ作って1秒ごとに2つのスレッドが数値を表示するプログラムを作りたいのですがうまくいきません。 #include<stdio.h> #include<string.h> #include<stdlib.h> #include<sys/socket.h> #include<arpa/inet.h> #include<unistd.h> #include<pthread.h> void *threadMain(void *threadArgs); int main(void) { int i = 0; pthread_t threadID; for(i = 0;i < 2;i++){ pthread_create(&threadID,NULL,threadMain,(void *)NULL); } } void *threadMain(void *threadArgs) { int i = 0; while(1){ printf("%d\n",++i); sleep(1); } } 上記プログラムを実行すると1が2回表示されて終了してしまいます。 どこか間違えがあるのでしょうか。。

  • お願いします。

    0から9までの数字を入力しあたりかはずれかを表示するプログラム。 #include<stdio.h> #include<time.h> #include<stdlib.h> int main(void){ int r,a; printf("0から9までの数字を入力してください。\n"); scanf("%d",&a); srandom(time(NULL)); r = random()%10; printf("%d \n",r); if(a==r){ printf("アタリ\n");} else{ printf("ハズレ\n");} return 0; }

  • C言語プログラミングについて

    #include <stdio.h> int main(void) { printf("hello,world\n"); } □■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■ #include <stdio.h> int main(void) { printf("hello"); printf(",world"); printf("\n"); } 上の2つのプログラムをコンパイルするとどのような違いが生じるんですか??printfってどんな働きをするんですか?

  • 乱数

    #include<stdio.h> #include<stdlib.h> #include<time.h> int main(void) { double n,end; printf("いくつ以上の値が出たら終了しますか?:"); scanf("%lf",&end); srand((unsigned)time(NULL)); for( ; ; ){ n=(double)rand(); printf("%f\n",n); if(n>=end) break; } return 0; } これなんですが、このまま実行すると.00000になってしまいます。 自分的には0.~にしたいのですが、どう変えればいいでしょうか? 回答お願いします。

  • 乱数について

    Visual Studio2008を使っています。 #include<stdio.h> #include<stdlib.h> #include<time.h> int main(void){ int i; srand(time(NULL)); i=rand(); printf("%d\n",i); return 0; } 乱数を作るために上のようなプログラミングを作りました。 これを「ソリューションのビルド」すると 【warning C4244: '引数' : 'time_t' から 'unsigned int' への変換です。データが失われる可能性があります。】 と出ます。 このまま行っても乱数が出来るのですが どうしたらいいのでしょうか? 8行目を srand(time_t(NULL)); srand((unsigned)time(NULL)); と変えればいいのでしょうか? time_tでやると乱数が同じ値しか出てきません。 教えてください。

  • 文字列の入力、数値変換について

    入力された数字を数値に変換するプログラムを作ったのですが、うまくいきません。 #include <stdio.h> #include <stdlib.h> #include <math.h> #include <string.h> #include <ctype.h> unsigned long long atollu(char[16]); void main(void){ unsigned long long input; char str[16]; char test[16] = "123456789012345"; int i,j=1; //atollu の動作確認・・・(1) printf("atollu test:%llu\n\n",atollu(test) ); //入力 NG: printf("%d回目 数値を入力(1~100000000000000 終了:exit)>",j); gets(str); input = atollu(str); //str と atollu(str) の確認 printf("%s %llu\n\n",str,atollu(str)); //exitと入力すると終了・・・(2) if(strcmp(str, "exit") == 0){ exit(0); } //数字以外がないか確認・・・(3) else { for( i=0; i<=15; i++){ if(isdigit(str[i]) == 0){ printf("NG\n"); for( i=0; i<=16; i++){ str[i]='\0'; } printf("moji\n"); j++; goto NG; } } } //範囲外 if(input>100000000000000 || input==0){ printf("NG\n"); printf("hani\n"); j++; goto NG; } printf("\n入力値は% llu",input ); } unsigned long long atollu(char str[16]){ unsigned long long t=0; int i,n; n = strlen(str) - 1; for( i=0; i<=15; i++){ if(str[i] == '\0'){ str[i] = 0;} else { t = t + (str[i] - '0') * pow(10.0,n-i);} } str[16] = '\0'; return t; } /* 数字を数値に変換する関数atolluは自分で作りました。 これの動作は(1)でちゃんとした値が出ているのでうまくできているようです。 (2)も"exit"と入力すれば終了するのでうまくいっています。 また、例えば "12" と入力したとき 12 9 NG moji 表示されますが、二回目以降は 12 12 NG moji となり、atollu(str)はうまく出力されている一方で、最後に「moji」と出てきているので、(3)でうまくいっていないようです。 どう直すべきなのか見当もつかないので困っています。 よろしくお願いします。

  • ポインタのポインタ

    こんにちは。 C言語の「ポインタのポインタ」の学習中なのですが、以下のプラグラムがエラーが出てしまします。 if文が間違っていると思うのですが、具体的に何がどう間違っているのがわかりません。 ご教示お願いいたします! #include<stdio.h> int main(void) { int date = 300; int *pdate = NULL; int **ppdate = NULL; printf("dateの値は%d<\n", date); pdate = &date; printf("*pdateの値は%d<\n", *pdate); if(**ppdate = NULL){ printf("**ppdateには何も与えられていません。\n"); } else{ return 0; } ppdate = &pdate; if(**ppdate == 300){ printf("**ppdateの値は%dになりました。正常です。\n", **ppdate); } /*強制終了を避けるためのプログラム*/ int i; scanf("%d", &i); return 0; }