2017-07-20 23 views
-2

ここにアマチュアプログラマー。今日の私の問題は、ダイアログボックスの編集ボックスに表示される.txtファイルを読み込もうとしていることです。ifstream getopenfilenameからファイル名を開かない

私がコードで始める前に、ファイルの場所を指定してgetopenfilenameから読み込みダイアログをバイパスして動作させることができます。しかし、私はgetopenfilenameからそのファイルの場所を取得、私はそれを動作させるように見えることはできません。

関連するコードは次のとおりです。

ZeroMemory(&ofn, sizeof(ofn)); 
ofn.lStructSize = sizeof(ofn); 
ofn.hwndOwner = hDlg; 
ofn.lpstrFile = szFile; 

ofn.lpstrFile[0] = '\0'; 
ofn.nMaxFile = sizeof(szFile); 
ofn.lpstrFilter = "All\0*.*\0Text\0*.TXT\0"; 
ofn.nFilterIndex = 1; 
ofn.lpstrFileTitle = NULL; 
ofn.nMaxFileTitle = 0; 
ofn.lpstrInitialDir = NULL; 
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; 
if (GetOpenFileName(&ofn) == TRUE) 
{ 
    hf = CreateFile(ofn.lpstrFile, GENERIC_READ, 0, LPSECURITY_ATTRIBUTES)NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, (HANDLE)NULL); 

    ifstream inFile(ofn.lpstrFile); 

    if (!inFile) 
     MessageBox(0, "CAN'T OPEN FILE", "ALERT", MB_OK | MB_ICONWARNING); 
    else 
    { 
     string text; 
     while(getline(inFile, text)); 
     inFile.close(); 

     MessageBox(0, text.c_str(), "msg", MB_OK); 
     SetWindowText(editbox, text.c_str()); 
    } 
    CloseHandle(hf); 
    hf = INVALID_HANDLE_VALUE; 

私は初心者ですが、私はこれを理解しようとしている私の脳と私のGoogleバーを障るされています。

fstream経由で開くことはありません。

+4

なぜWin32 APiとC++標準ライブラリの両方を使ってファイルを開こうとしますか? –

+0

_iは動作していないようです._そして、... **正確に**は問題ですか? –

+0

元の問題とは別に、ファイルの読み方にもバグがあります。各 'getline()'コールが 'text'変数の内容を上書きするため、ファイルの最後の行だけが表示されます。 – zett42

答えて

3

問題の原因は、あなたがのWin32 API(CreateFile())と標準ライブラリ(std::ifstream)の両方でファイルを開こうとしていることです。あなたのCreateFile()呼び出し時およびdocumentationを見ることによって

、1あなたはその説明状態dwShareMode引数に0を渡していることがわかります。このパラメータがゼロであるとのCreateFileが成功した場合

は、ファイルまたはデバイスは共有できません。ファイルまたはデバイスへのハンドルが閉じられるまで、デバイスを再び開くことはできません。

しかし、その呼び出しの後、あなたは上記の理由による失敗し、std::ifstream経由でファイルを開こうとして進み、そしてifstreamは、ファイルを開くために成功した場合にのみチェックされています。

CreateFile()またはstd::ifstreamのいずれか一方のみを使用すると、この問題は回避できます。

関連する問題