Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[WinApi] Zapis do pliku

Ostatnio zmodyfikowano 2009-10-03 22:35
Autor Wiadomość
steckel
Temat założony przez niniejszego użytkownika
[WinApi] Zapis do pliku
» 2009-10-03 12:18:34
Witam! Napisałem sobie taką funckję:
C/C++
void SaveFileEx( string pathOfFile, string txt ) {
    LPSTR Bufor;
    DWORD dwRozmiar = txt.length();
    Bufor =( LPSTR ) GlobalAlloc( GPTR, dwRozmiar + 1 );
    Bufor =( LPSTR ) txt.c_str();
    DWORD dwZapisane;
    HANDLE hPlik;
    hPlik = CreateFile( pathOfFile.c_str(), GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, 0, NULL );
    while( !WriteFile( hPlik, Bufor, dwRozmiar, & dwZapisane, NULL ) );
   
    CloseHandle( hPlik );
}
Dziwnie reaguje ona na argumenty, bo efektem tego kodu:
C/C++
SaveFileEx( "text.txt", "AAA" );
SaveFileEx( "text.txt", lista );
oraz gdy zamienię miejscami te instrukcje, jest "AAA" w pliku "text.txt". Zmienna |lista| nie jest pusta, bo sprawdzam ją funckją
MessageBox( 0, lista.c_str(), 0, 0 );

caly projekt
P-10591
pompom
» 2009-10-03 15:01:23
Dlaczego miałeś zamiar kopiować zawartość stringa do buforu?
WriteFile(hPlik, txt.c_str(), txt.length(), &dwZapisane, NULL)
Działa.

A ta pętla to naprawdę głupi pomysł. Przecież błąd nie zniknie - program się zapętli.
Sprawdzaj, czy createfile się powiodło, jeśli tak, wykonaj writefile, sprawdź czy się powiodło.
Możesz albo zwracać powodzenie (bool) albo rzucać wyjątek.

Stosowanie wyjątków wymaga jednak stosowania wszędzie albo raii albo konstrukcji finally (albo z boosta, albo zrobiona na try/catch), więc na razie zwracaj kod powodzenia.
Ja sobie zrobiłem wraper w formie Wrap<TYP>.
Np.
Wrap<HANDLE> hFile(CloseHandle, INVALID_HANDLE_VALUE) = CreateFile(...);
INVALID_HANDLE_VALUE oznacza wartość pust. Jeśli wartość jest inna, wywoła destruktor na końcu.
Ale to już taka dygresja.

A czemu kod u ciebie teraz źle działa - nie wiem. Być może odpowiedź jest w kodzie wołającym, ale nie chce mi się ściągać projektu.
P-10593
steckel
Temat założony przez niniejszego użytkownika
» 2009-10-03 19:43:08
C/C++
void SaveFileEx( string pathOfFile, string txt ) {
    DWORD dwZapisane;
    Wrap < HANDLE > hPlik = CreateFile( pathOfFile.c_str(), GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, 0, NULL ) );
    WriteFile( hPlik, txt.c_str(), txt.size(), & dwZapisane, NULL );
    CloseHandle( hPlik );
}

1>D:\projekty\include\windows.hpp(53) : error C2065: 'Wrap' : undeclared identifier
1>D:\projekty\include\windows.hpp(53) : error C2275: 'HANDLE' : illegal use of this type as an expression
1>        C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\winnt.h(402) : see declaration of 'HANDLE'
1>D:\projekty\include\windows.hpp(53) : error C2065: 'hPlik' : undeclared identifier
1>D:\projekty\include\windows.hpp(53) : error C2059: syntax error : ')'
1>D:\projekty\include\windows.hpp(56) : error C2065: 'hPlik' : undeclared identifier
1>D:\projekty\include\windows.hpp(57) : error C2065: 'hPlik' : undeclared identifier
1>.\main.cpp(203) : warning C4018: '<' : signed/unsigned mismatch
1>class.cpp
1>D:\projekty\include\windows.hpp(53) : error C2065: 'Wrap' : undeclared identifier
1>D:\projekty\include\windows.hpp(53) : error C2275: 'HANDLE' : illegal use of this type as an expression
1>        C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\winnt.h(402) : see declaration of 'HANDLE'
1>D:\projekty\include\windows.hpp(53) : error C2065: 'hPlik' : undeclared identifier
1>D:\projekty\include\windows.hpp(53) : error C2059: syntax error : ')'
1>D:\projekty\include\windows.hpp(56) : error C2065: 'hPlik' : undeclared identifier
1>D:\projekty\include\windows.hpp(57) : error C2065: 'hPlik' : undeclared identifier
C/C++
void SaveFileEx( string pathOfFile, string txt ) {
    DWORD dwZapisane;
    HANDLE hPlik;
    while( !hPlik = CreateFile( pathOfFile.c_str(), GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, 0, NULL ) );
   
    WriteFile( hPlik, txt.c_str(), txt.size(), & dwZapisane, NULL );
    CloseHandle( hPlik );
}

1>D:\projekty\include\windows.hpp(55) : warning C4800: 'HANDLE' : forcing value to bool 'true' or 'false' (performance warning)
1>D:\projekty\include\windows.hpp(55) : error C2106: '=' : left operand must be l-value
1>.\main.cpp(203) : warning C4018: '<' : signed/unsigned mismatch
1>class.cpp
1>D:\projekty\include\windows.hpp(55) : warning C4800: 'HANDLE' : forcing value to bool 'true' or 'false' (performance warning)
1>D:\projekty\include\windows.hpp(55) : error C2106: '=' : left operand must be l-value
Co robię źle?

PS. Wcześniej bez pętli też nic nie zapisywało.
P-10600
Thud
» 2009-10-03 19:49:58
Wydaje mi się, czy nie ma jednego równa się. Hmm... nie pamiętam (lub nie widziałem całego kodu), ale coś mi się wydaje że coś Ci z tym szablonem nie wychodzi.
P-10602
Thud
» 2009-10-03 20:13:12
@up:
On chciał zmienić prawa matematyki. :D
Taki przyjazny joke.
P-10606
pompom
» 2009-10-03 20:39:35
C/C++
bool SaveFileEx( const string & pathOfFile, const string & txt ) {
    DWORD dwZapisane;
    HANDLE hPlik = CreateFile( pathOfFile.c_str(), GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, 0, NULL );
    if( hPlik == INVALID_HANDLE_VALUE ) return false;
   
    bool ok = WriteFile( hPlik, txt.c_str(), txt.size(), & dwZapisane, NULL );
    CloseHandle( hPlik );
    return ok;
}
Zwraca stan powodzenia. True - ok, false - nie udało się. Później można wypisać błąd korzystając z FormatMessage i GetLastError().
A jak nie działa zawsze, to ustaw breakpoint na starcie funkcji, włącz debugger, zobacz co zwracają funkcję itd.

(a wrap to oczywiście mój własny kod, więc w bibliotece go nie ma...)
P-10609
steckel
Temat założony przez niniejszego użytkownika
» 2009-10-03 20:41:20

W drugim przypadku to próbujesz coś przypisać do wartości - jak 2=foo() ci nie działa, to też się zastanawiasz czemu?
Gdzieś czytałem, że to jest tak:
C/C++
int zmienna;
if( zmienna = 0 ); //false

if( zmienna = 1 ); //true

Myślałem, że analogicznie będzie w tym przypadku.

No wiesz, ten Wrap<> to sobie sam musisz napisać...
Możesz podać przykład?
P-10610
manfred
» 2009-10-03 13:45:56
Dziwnie reaguje ona na argumenty, bo efektem tego kodu:
C/C++
SaveFileEx( "text.txt", "AAA" );
SaveFileEx( "text.txt", lista );
(...)jest "AAA" w pliku "text.txt".
Kłamiesz.
P-19399
« 1 » 2
  Strona 1 z 2 Następna strona