Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[API][MFC] odczyt z pliku, problem z nazwą pliku

puntigamer 24 Wrz 2009 00:07 1978 2
  • #1 24 Wrz 2009 00:07
    puntigamer
    Poziom 13  

    Cześć
    Jak wiadomo win/dos uzywa backslashy przy oddzielaniu katalogów w ścieżce.
    W C-stringu ten ukośnik jest znakiem specjalnym i aby rzeczywiscie wprowadzic backslash trzeba go poprzedzić backslashem ( \\ ) : )

    Problem jest taki, mam kod, który reaguje na naciśnięcie przycisku, ktorego akcja to odczyt danych z pliku.

    Code:
            OPENFILENAME ofn;       // common dialog box structure
    
    char szFile[260];       // buffer for file name
    HWND hwnd=0;              // owner window
    HANDLE hf;              // file handle

    // Initialize OPENFILENAME
    ZeroMemory(&ofn, sizeof(ofn));
    ofn.lStructSize = sizeof(ofn);
    ofn.hwndOwner = hwnd;
    ofn.lpstrFile = szFile;
    // Set lpstrFile[0] to '\0' so that GetOpenFileName does not
    // use the contents of szFile to initialize itself.
    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;


    // Display the Open dialog box.

    if (GetOpenFileName(&ofn)==TRUE)
        hf = CreateFile(ofn.lpstrFile,
                        GENERIC_READ,
                        0,
                        (LPSECURITY_ATTRIBUTES) NULL,
                        OPEN_EXISTING,
                        FILE_ATTRIBUTE_NORMAL,
                        (HANDLE) NULL);

    ifstream strumien(szFile,  ios::in );

    if (!strumien)
    {
    MessageBox("blad otwarcia pliku", "Blad otwarcia pliku", MB_OK);
    strumien.clear(strumien.rdstate() & ~ios::failbit);

    }



    Jak wiadomo wyskakuje okno z możliwością wyboru pliku. Po kliknieciu OK, szFile zawiera ścieżkę do pliku. Niestety to powoduje za każdym razem, ze if sprawdzający jest prawdziwy, czyli strumień nie odwotzył tego pliku do odczytu. Dlaczego tak się dzieje, jeśli Bardzo podobny kod obsługuje mi poprawne zapisywanie danych do pliku (ktory nawet nie istnieje na dysku).

    Jeśli napiszę tak:
    Code:
    string nazwa_pliku = "C:\\Documents and Settings\\Puntigamer\\Moje dokumenty\\Visual Studio 2005\\Projects\\ExoSliderTest2\\debug\\adas.txt";
    
    ifstream strumien;
    strumien.open(nazwa_pliku.c_str(),  ios::in );


    Wszystko jest w porządku.

    Co poradzicie? Czy mam jakieś błędy w ustawieniu struktury CreateFile do odczytu?

    Co dziwne sprawdzilem zawartosc szFile oraz drugim razem "nazwa_pliku.c_str()". pokazuja to samo (czyli pojedyncze basksleshe) a jednak ta pierwsza wersja jest z jakiegos powodu zla...

    0 2
  • Pomocny post
    #2 24 Wrz 2009 07:50
    jestam
    Specjalista Automatyk

    GetOpenFileName() po kliknięciu OK zwraca wartość niezerową, więc warunek if() jest spełniony i wywoływana jest CreateFile().

    Trzeci parametr CreateFile (u Ciebie 0), za MSDN:

    Cytat:

    If this parameter is zero and CreateFile succeeds, the file or device cannot be shared and cannot be opened again until the handle to the file or device is closed.


    więc ifstream.open() musi zakończyć się z błędem.

    Po co wywołujesz CreateFile() ??

    0
  • #3 25 Wrz 2009 03:08
    puntigamer
    Poziom 13  

    Rozumiem :)
    Dzięki. usunąłem i działa. Zagapiłem się : D

    0