0

WindowsのMinGWでLPSTRからconstchar*に変換するのに問題があります。

#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とは何かは知っていますが、このコードに適用する方法がわかりません。

MinGWはそれをサポートしていないので、使用を提案しないでくださいatlbase.h。どうしても必要な場合を除いて、Visualに戻るつもりはありません。

4

1 に答える 1

2

あなたは間接参照について少し混乱しているようです。 LPSTRですchar*。これは、へのポインタですchar(または、ここでの場合のように、の配列の最初の要素へのポインタchar)。

を呼び出すときは、の配列の初期要素とその配列のサイズGetCurrentDirectoryへのポインタを渡す必要があります。charしたがって、あなたがする必要があるのは、配列を宣言し、それを関数に渡すことです。例えば、

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

buffer現在の実装では、プログラムは初期化されていないため確実にクラッシュGetCurrentDirectoryし、メモリ内のランダムな場所に書き込もうとします。

また、の戻り値をチェックしGetCurrentDirectoryて、正常に完了し、バッファーに完全なパスが含まれていることを確認する必要があります。 そのドキュメントには、返される可能性のある値が説明されています。

パスを取得したら、それを直接に渡すことができますopendir:配列bufferは暗黙的にその初期要素へのポインタに変換可能です-つまり、はchar[MAX_PATH]に変換できます-そしてそれは暗黙的に必要なものに変換できます:char*char*char const*opendir

DIR* dir = opendir(buffer);

GetCurrentDirectoryの署名は、マクロが定義されているかどうかによって異なることに注意してUNICODEください。プログラムをUnicode用にコンパイルしている場合、実際にはの配列へのポインタを取りますwchar_t。Unicodeプログラムを作成する場合は、これを考慮する必要があります(可能であれば、Unicodeを使用する必要があります)。

于 2012-08-11T01:07:19.610 に答える