2012-08-11 7 views
0

У меня возникли проблемы с преобразованием из LPSTR в const char * в MinGW под Windows.C++ - Преобразование LPSTR в const char * в MinGW под Windows

#include <dirent.h> 
#include <cstdio> 
#include <fstream> 
#include <windows.h> 

int main() { 
    DIR *dir; 
    struct dirent *ent; 
    LPSTR buffer; 
    GetCurrentDirectory(100, buffer); 
    const char *str = *buffer; 
    dir = opendir(*str); 
    return 0; 
} 

Что я пытаюсь сделать, это захватить список всех текущих файлов в каталоге и записать его в файл; Я могу сделать последнее, но первое задает мне некоторые проблемы. Я могу выяснить, как читать каталог, как только я могу преобразовать разные типы переменных.

Я знаю, что такое LPSTR, но я не знаю, как применить его к этому коду.

Не предлагайте использовать atlbase.h, потому что MinGW не поддерживает его, и я не хочу возвращаться к Visual, если это абсолютно необходимо.

ответ

2

Вы, кажется, немного смущены по поводу косвенности. LPSTR - char*. Это указатель на char (или, как в данном случае здесь, указатель на начальный элемент массива char).

Когда вы вызываете GetCurrentDirectory, вам необходимо передать ему указатель на начальный элемент массива char и размер этого массива. Итак, вам нужно объявить массив и передать его в функцию. Например,

char buffer[MAX_PATH]; 
GetCurrentDirectory(MAX_PATH, buffer); 

С вашей текущей реализацией, ваша программа будет несомненно авария, потому что buffer в неинициализированном, так GetCurrentDirectory будет пытаться записать на некоторое случайное место в памяти.

Вы должны также проверить возвращаемое значение GetCurrentDirectory, чтобы убедиться, что оно выполнено успешно и что буфер содержит полный путь. Its documentation объясняет значения, которые он может вернуть.

После того, как у вас есть путь, вы можете передать его непосредственно opendir: массив buffer неявно преобразовать в указатель на его начальный элемент - то есть, char[MAX_PATH] может быть преобразован в char* -й что char* может быть неявно преобразованы в char const* требуемого opendir:

DIR* dir = opendir(buffer); 

Обратите внимание, что подпись GetCurrentDirectory зависит от того, определен ли UNICODE макроса или нет: если вы компилируете программу для Unicode, он фактически принимает указатель массив wchar_t. Если вы создадите программу Unicode, вам нужно будет учесть это (вы должны использовать Unicode, если вы можете) должен.

+0

Спасибо, Макнеллис! Итак, как я могу использовать Unicode? – zeroslash

+0

В MinGW? Я не знаю. –

+0

Ах, спасибо в любом случае. Кажется, у MinGW не хватает нескольких функций, которые есть у Visual, поэтому мне может потребоваться переключение или поиск обходного пути. Несмотря ни на что, я ценю помощь. – zeroslash

Смежные вопросы