2012-05-22 4 views
2

내 컴퓨터의 예에서 원하는 출력은 "C : E : F : H : N :"이어야합니다. 나는 그것이 가능하다는 것을 안다. 그러나 그것을하는 가장 간단한 방법은 무엇인가? QueryDosDevice 출력의 도터 화시스템 volumines 목록을 반환하는 프로그램

#ifndef UNICODE 
#define UNICODE 
#endif 


#include <Windows.h> 
#include <fstream> 
#include <iostream> 

const int REPORT_LENGTH = 5000; 

int main(void) 
{ 
    TCHAR targetPath[REPORT_LENGTH]; 

    std::ofstream oFile; 

    oFile.open("dos device query.txt"); 

    QueryDosDevice(NULL,targetPath,REPORT_LENGTH); 

    for(int i=0; i<REPORT_LENGTH;i++) 
    if (targetPath[i]=='\0')(targetPath[i]='\n'); 



    for(int i=0; i<REPORT_LENGTH; i++) 
    oFile<<static_cast<char>(targetPath[i]); 

    oFile.close(); 

    return 0; 
} 

은 많은 시간과 자원을 낭비합니다. 또한 GetLogicalDriveStrings 기능은 나를 많이 배반했습니다.

#include <Windows.h> 

int main() 
{ 
    TCHAR buffer[50]; 

    GetLogicalDriveStrings(50,buffer); 

    MessageBox(0,buffer,"Drives in the system",MB_OK); 


    return 0; 
} 

"C : \"볼륨 만 표시합니다. (영업 이익과 독자들에게 연습 문제로 남겨되는),이기는하지만하지 문자열로 합치와

+4

출력을 잘못 해석하면 GetLogicalDriveStrings에 문제가 발생할 수 있습니다. –

답변

3

GetLogicalDrives 포함) :

#include <stdio.h> 
#include <tchar.h> 
#include <Windows.h> 

int __cdecl _tmain(int argc, _TCHAR *argv[]) 
{ 
    // Get the bit mask of drive letters 
    DWORD drives = ::GetLogicalDrives(); 
    // Go through all possible letters from a to z 
    for(int i = 0; i < 26; i++) 
    { 
     // Check if the respective bit is set 
     if(drives & (1 << i)) 
     { 
      // ... and if so, print it 
      _tprintf(TEXT("Drive %c: exists\n"), _T('A') + i); 
     } 
    } 
    return 0; 
} 
3

GetLogicalDriveStrings() 갈 방법입니다, 당신은 단지에있는 올바르게 사용하십시오. 모든 드라이브 문자열을 포함하는 단일 문자열을 반환한다고 가정하고 있지만 사실이 아닙니다. 각 드라이브에 하나씩 문자열 배열을 반환하므로 배열을 루프 처리해야합니다.

#include <windows.h> 

int main() 
{ 
    TCHAR buffer[(4*26)+1] = {0}; 
    GetLogicalDriveStrings(sizeof(buffer)/sizeof(TCHAR), buffer); 

    for (LPTSTR lpDrive = buffer; *lpDrive != 0; lpDrive += 4) 
     MessageBox(NULL, lpDrive, "Drive in the system", MB_OK); 

    return 0; 
} 
+0

편집 내용을 설명해 주시겠습니까? 모든 실제적인 목적으로 이것은 아무것도 변하지 않을 것이지만,'% c'는 정의에 의존하지 않고 항상'char'입니다. 그래서 이것이 정확히 개선 된 이유를 알고 싶습니다. . 감사. – 0xC0000022L

+0

'% c'은 항상'char'가 아닙니다. '_tprintf()'는'_UNICODE'가 정의되어 있는지에 따라'printf()'또는'wprintf()'에 매핑됩니다. '% c'는'printf()'의'char'와'wprintf()'의'wchar_t'입니다. ''A '리터럴은 항상'char'이지만'_T ('A ')'로 감싸서'_TCHAR'가되어'_UNICODE'를 기반으로'char' 또는'wchar_t'에 매핑됩니다. 'wprintf()'에'char' 입력을 사용하려면 대신'% C','% hc' 또는'% hC'을 사용해야합니다. –

+0

오케이, 고마워. 그 대답. – 0xC0000022L

관련 문제