統合開発環境:BCC Developer
コンパイラ:borland C++ compiler
を使用していたのですが、
ついさっき Visual C++ 2008 に乗り換えてみました。
「14歳からはじめるC言語オンラインゲームプログラミング教室」という本にVC++の設定方法が書かれていたので、それに従って設定してみました。さっそく以前作っていたプログラムをビルドして実行してみようと思ったのですが、わけのわからないエラーが出ました。もちろんborlandの時は正常にコンパイル、正常に動作しました。
以下エラー文
------ ビルド開始: プロジェクト: GetAllFilePass, 構成: Debug Win32 ------
コンパイルしています...
GetAllFilePass.cpp
c:\documents and settings\administrator\my documents\visual studio 2008\projects\getallfilepass\getallfilepass.cpp(14) : warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
c:\program files\microsoft visual studio 9.0\vc\include\stdio.h(366) : 'sprintf' の宣言を確認してください。
c:\documents and settings\administrator\my documents\visual studio 2008\projects\getallfilepass\getallfilepass.cpp(15) : error C2664: 'FindFirstFileW' : 1 番目の引数を 'char [260]' から 'LPCWSTR' に変換できません。(新しい機能 ; ヘルプを参照)
指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
c:\documents and settings\administrator\my documents\visual studio 2008\projects\getallfilepass\getallfilepass.cpp(22) : error C2664: 'strcmp' : 1 番目の引数を 'WCHAR [260]' から 'const char *' に変換できません。(新しい機能 ; ヘルプを参照)
指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
c:\documents and settings\administrator\my documents\visual studio 2008\projects\getallfilepass\getallfilepass.cpp(22) : error C2664: 'strcmp' : 1 番目の引数を 'WCHAR [260]' から 'const char *' に変換できません。(新しい機能 ; ヘルプを参照)
指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
c:\documents and settings\administrator\my documents\visual studio 2008\projects\getallfilepass\getallfilepass.cpp(31) : error C2664: 'strcat' : 2 番目の引数を 'WCHAR [260]' から 'const char *' に変換できません。(新しい機能 ; ヘルプを参照)
指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
c:\documents and settings\administrator\my documents\visual studio 2008\projects\getallfilepass\getallfilepass.cpp(38) : error C2679: 二項演算子 '+=' : 型 'WCHAR [260]' の右オペランドを扱う演算子が見つかりません (または変換できません)。
c:\program files\microsoft visual studio 9.0\vc\include\xstring(929): 'std::basic_string<_Elem,_Traits,_Ax> &std::basic_string<_Elem,_Traits,_Ax>::operator +=(const std::basic_string<_Elem,_Traits,_Ax> &)' の可能性があります。
with
[
_Elem=char,
_Traits=std::char_traits<char>,
_Ax=std::allocator<char>
]
c:\program files\microsoft visual studio 9.0\vc\include\xstring(934): または 'std::basic_string<_Elem,_Traits,_Ax> &std::basic_string<_Elem,_Traits,_Ax>::operator +=(const _Elem *)'
with
[
_Elem=char,
_Traits=std::char_traits<char>,
_Ax=std::allocator<char>
]
c:\program files\microsoft visual studio 9.0\vc\include\xstring(939): または 'std::basic_string<_Elem,_Traits,_Ax> &std::basic_string<_Elem,_Traits,_Ax>::operator +=(_Elem)'
with
[
_Elem=char,
_Traits=std::char_traits<char>,
_Ax=std::allocator<char>
]
引数リスト '(std::string, WCHAR [260])' を一致させようとしているとき
c:\documents and settings\administrator\my documents\visual studio 2008\projects\getallfilepass\getallfilepass.cpp(53) : warning C4018: '<' : signed と unsigned の数値を比較しようとしました。
ビルドログは "file://c:\Documents and Settings\Administrator\My Documents\Visual Studio 2008\Projects\GetAllFilePass\Debug\BuildLog.htm" に保存されました。
GetAllFilePass - エラー 5、警告 2
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
#include <windows.h>
#include <string.h>
#include <string>
#include <vector>
#include <stdio.h>
using namespace std;
void ListUp(const char *direName, vector<string> &fileNs, bool searchFlag){
WIN32_FIND_DATA fData; //ファイル又はフォルダの情報がここに格納される
HANDLE fHand; //検索時のハンドルを格納
{
char seDirName[_MAX_PATH]; //一時的にフォルダ名を記憶しておくだけ
sprintf(seDirName,"%s\\*",direName); //フォルダ名に\\ワイルドカードを連結
fHand = FindFirstFile(seDirName, &fData); //検索を行い、ハンドルを取得
}
//ファイル又はフォルダがみつかった ならば
if(fHand != INVALID_HANDLE_VALUE){
do{
// '.'や'..'以外だった ならば
if(strcmp(fData.cFileName, ".") && strcmp(fData.cFileName, "..") ) {
//見つかったのがフォルダだった ならば
if(fData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
//フォルダ以下全検索に設定されている ならば サブフォルダの処理
if(searchFlag){
char sFindSubDir[_MAX_PATH]; //フォルダ名格納用
strcpy(sFindSubDir, direName); //検索フォルダのフルパス文字列をコピー
strcat(sFindSubDir, "\\"); //文字列に\\を追加
strcat(sFindSubDir, fData.cFileName); //検索結果のフォルダ名を文字列に追加
ListUp(sFindSubDir, fileNs, 1); // 再帰呼び出し
}
} else {
// ファイルのとき
string str = direName;
str += "\\";
str += fData.cFileName;
fileNs.push_back(str); //ファイル名を記憶
}
}
} while(FindNextFile(fHand, &fData));
FindClose(fHand); //検索に使用したデータを破棄
}
}
int GetAllFilePass(const char *direName, const char *extens, vector<string> &filePs, bool searchFlag){
vector<string> foundFNs;
ListUp(direName, foundFNs, searchFlag);
for(int i=0;i<foundFNs.size();i++){
//i番目の文字列の最後の"."以降の文字列を取得
const char *exten = strrchr(foundFNs[i].c_str(), '.');
//その次の文字列がextenに含まれるか調べる
//含まれていたらfileNs.push_back()で追加する
if( strstr( extens, exten )!=NULL ) filePs.push_back(foundFNs[i]);
}
return filePs.size();
}
int main(){
vector<string> fns;
int num = GetAllFilePass("C:\\Documents and Settings\\Administrator\\デスクトップ", ".mp3.flv.wav", fns, 1);
//for(int i=0;i<num;i++) printf("%s\n", fns[i].c_str());
printf("\n%d", num);
}
また、VC++では行番号が表示されないのですが、これは仕様でしょうか。行番号を表示させることはできないのでしょうか。
よろしくお願い致します。