アプリ版:「スタンプのみでお礼する」機能のリリースについて

MFCでファイルを読込むプログラムを作成しているのですが、
例題を丸写しに近い状態で利用したため、変数の意味が分からず、困っております。
以下がそのプログラムなのですが・・・。
/***********************************************************************************************
void CProgramDoc::OnFileRead(CDC *pDC)
{
// TODO: この位置にコマンド ハンドラ用のコードを追加してください
CFileDialog filedlg(TRUE//ファイル読み込みモード
, "txt"//デフォルトの拡張子
, NULL//デフォルトで指定するファイル名
, OFN_HIDEREADONLY//オプション指定のフラグ
, "グリッドファイル(*.txt)|*.txt|すべてのファイル(*.*)|*.*||");//ファイル名のフィルタ

CStdioFilestdfile;
ifstream ifs;

int Lineindex=0;

if( filedlg.DoModal() == IDOK)
{//ダイアログを表示し,OKボタンが押されたならば
m_sPath = filedlg.GetPathName();
if(stdfile.Open(m_sPath,CFile::modeRead))
{//ファイルを正常に開けた場合

while(stdfile.ReadString(buffer))
{
m_pos = NULL;
m_strList.AddTail(buffer);
Lineindex++;
}
m_pos = m_strList.GetHeadPosition();//先頭部分の要素の位置を返す

m_sKanji = m_strList.GetNext(m_pos);//posの位置を次へ移動させる。漢字取得
m_sRomaji = m_strList.GetNext(m_pos);//ローマ字取得

POSITION pos = GetFirstViewPosition();
stdfile.Close();
}
else
{
AfxMessageBox("ファイルを開くことができませんでした");
}
}
}
//***********************************************************************************************

このプログラムでファイル名を代入している変数は、m_sPath で良いのでしょうか。
そして、例えば、『A.txt』というファイルを読込んだ際、
if(m_sPath=="A.txt")
{
------
}
と言ったようにファイルの名前が『A.txt』ならばというようなif文を作成することができるのでしょうか?

問題が多岐にわたってしまい、申し訳ございません。
よろしくお願いします。

A 回答 (2件)

>このプログラムでファイル名を代入している変数は、m_sPath で良いのでしょうか。


半分正解で、半分不正解。

m_sPathには「ファイル名のみ」ではなく「ドライブ名、パス名、拡張子が付いたファイル名」が入っています。

>そして、例えば、『A.txt』というファイルを読込んだ際、
>if(m_sPath=="A.txt")
>{
>------
>}
>と言ったようにファイルの名前が『A.txt』ならばというようなif文を作成することができるのでしょうか?

単純にはできません。

それをやるには、m_sPathの内容に含まれている「ドライブ名、パス名、拡張子が付いたファイル名」から「拡張子が付いたファイル名」を取り出し、更に、英字をすべて大文字か小文字に書き換えた上で、目的のファイル名か判断しなければなりません。


1.「C:\MyFolder\TextFile\Mydata\a.Txt」から「a.Txt」を取り出す
2.「a.Txt」の英字を全部大文字に書き換え「A.TXT」にする
3.「A.TXT」と比較する

ファイル選択ダイアログで「A.txt」と入力して「A.txt」をオープンしようとしても、ファイル名の英字の大文字小文字は同一視されますから、実際に開かれるファイル名は「C:\MyFolder\TextFile\Mydata\a.Txt」とかになっている可能性があります。

なので、上記1~3のような「面倒な前処理」が必要です。

この回答への補足

ご解答ありがとうございます。
それでは、m_sPath==""C:\MyFolder\TextFile\Mydata\a.txt"
としたら、結果として読込めるということでしょうか?

補足日時:2008/08/22 14:43
    • good
    • 0

こんばんは。

だいぶ混乱している様ですので。

>>このプログラムでファイル名を代入している変数は、m_sPath で良いのでしょうか。
 はい。

 //ダイアログを表示し,OKボタンが押されたならば
 m_sPath = filedlg.GetPathName();
 ↑この部分でファイルダイアログで選択したファイルへのパス文字列が代入されています。


>>と言ったようにファイルの名前が『A.txt』ならばというようなif文を作成することができるのでしょうか?
 はい。
 m_sPathの文字列から「ファイル名」の部分を取り出します。m_sPathと言うのは恐らくMFCのCStringの事だと思います。
 CStringの操作方法を確認しておいた方が良い筈です。

 「CStringT」
 http://msdn.microsoft.com/ja-jp/library/abzc9989 …

 又、処理が必要になる度長々と書く訳にも行かなくなるので、こう行った物は、関数にしまって使いまわす様にします。

//パスを剥がしてファイル名を出力する関数(デバッガで追って変数内などを確認してみて下さい)
static const CString StripPath(const CString& sPath)
{
//\を逆から見つけるposには\の見つかった位置が入る
const int pos= sPath.ReverseFind('\\');

//\が見当たらなければposの中は-1が入っている
if(pos == -1)
return CString();

//\の見つかった位置+1から、右を取り出す
CString sFile = sPath.Mid(pos + 1);

//大文字に変換する
sFile.MakeUpper();

return sFile;
}

//------------------------------------------------------------
//使用する
 //ダイアログを表示し,OKボタンが押されたならば
 m_sPath = filedlg.GetPathName();

 //変更してはならない物には出来る限りconstキーワードを使用して固定します。
 const CString sFile = ::StripPath(m_sPath);

 if(sFile == "A.TXT")
 {
  //ファイル名が一致したのでココで何かする
 }
//------------------------------------------------------------
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!