ページ 11

dirent.hについて

Posted: 2012年11月23日(金) 05:40
by 太郎S
ディレクトリ内のファイル名を取得するプログラムを、C言語とDxLibを使い作ろうと思い、以下のコードを実行してみました

コード:

#include "DxLib.h"
#include "dirent.h"

int WINAPI WinMain( HINSTANCE,HINSTANCE, LPSTR,int ){
	ChangeWindowMode( TRUE ), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK );

	DIR* dir;
	struct dirent* dp;
  
	if (NULL == (dir = opendir("./"))){
		DrawString( 0,0, "ディレクトリを開けませんでした", GetColor( 255,255,255 ) );
		exit(1);
	}
  
	for(int i = 0; NULL != (dp = readdir(dir)); i++){
		DrawFormatString( 0, 20*i, GetColor(255,255,255), "%d:%s\n" , i , dp->d_name);
	}
  
	closedir(dir);

	ScreenFlip();
	WaitKey();

	DxLib_End();
	return 0;
}
するとエラー
main.obj : error LNK2019: 未解決の外部シンボル _closedir が関数 _WinMain@16 で参照されました。
main.obj : error LNK2019: 未解決の外部シンボル _readdir が関数 _WinMain@16 で参照されました。
main.obj : error LNK2019: 未解決の外部シンボル _opendir が関数 _WinMain@16 で参照されました。
C:\Documents and Settings\USER \My Documents\Visual Studio 2008\Projects\test\Debug\test.exe : fatal error LNK1120: 外部参照 3 が未解決です

projectと同じ階層にdirent.hとdirent.libを置いたのに何がいけないのでしょうか?
まだプログラム初心者でVC++EE2008もよく使い方を分かっていませんが、エラーの原因を指摘してもらいたいです。宜しくお願いします。

Re: dirent.hについて

Posted: 2012年11月23日(金) 08:44
by へにっくす
エラーは、リンカのエラーです。
エラーの解決策は
プロジェクト設定で、追加のライブラリにdirent.libを書くか、
#pragma comment(lib, ファイルパス)
とソースに直接書くかです。

詳しくはググってくださいね


dirent.h、dirent.libは自分で作成したモノですか?
そうでないなら、わざわざプロジェクトのフォルダにコピーする必要はありません。

Re: dirent.hについて

Posted: 2012年11月23日(金) 09:52
by softya(ソフト屋)
Unix/Linux風のopendirを使わなければdirent.libは必要ないのでは?
WindowsならFindFirstFile、FindNextFileで代用することができます(ファイルも列挙されるのは問題ですが)。

Re: dirent.hについて

Posted: 2012年11月23日(金) 13:56
by 太郎S
へにっくすさんありがとうございます
 プロジェクトの設定からライブラリ追加したところ、前のエラーは無くなりましたが別のエラーが出てきました
再定義やら何やら・・・DxLibと一緒には使えないのかなぁ

ソフト屋さんありがとうございます。
 FindFirstFileを使用するとエラーが・・・

コード:

#include "DxLib.h"

int WINAPI WinMain( HINSTANCE,HINSTANCE,LPSTR,int){
	ChangeWindowMode( TRUE ), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK );

	WIN32_FIND_DATA fd;
	char* dir = "*.*";
	HANDLE h;
	int i=0;

	h = FindFirstFile(dir, &fd);

	do {
		DrawFormatString(0,20*i,GetColor( 255,255,255 ), "%s", fd.cFileName);
		i++;
	} while(FindNextFile(h, &fd));

	FindClose(h);

	ScreenFlip();

	WaitKey();

	DxLib_End();
	return 0;
}
error C2664: 'FindFirstFileW' : 1 番目の引数を 'char *' から 'LPCWSTR' に変換できません。
error C2664: 'DxLib::DrawFormatString' : 4 番目の引数を 'const char [3]' から 'const TCHAR *' に変換できません。
申し訳ありませんがこのエラーの原因を教えてもらえたら幸いです・・・

Re: dirent.hについて

Posted: 2012年11月23日(金) 14:02
by nil
プロジェクトの設定から文字コードをマルチバイトに設定してください。

Re: dirent.hについて

Posted: 2012年11月23日(金) 14:23
by 太郎S
涼雅さんありがとうございます
 できました!設定していたと思ったら設定されていなかっただけでした、みなさんありがとうございます!