DejaVu |
» 2009-09-10 21:06:10 bo Twój kolega mógł zrobić tak, że jeśli pliku nie da się odczytać to czeka X milisekund po czym próbuje uzyskać dostęp do niego ponownie. |
|
pompom |
» 2009-09-10 21:27:41 @malan: "a to nie działa tak, że jeśli chcesz korzystać z jakiegoś pliku w 2 programach to plik musisz zamknąć i otworzyć ponownie ?" Oczywiście że nie. Są takie flagi jak FILE_SHARE_READ, FILE_SHARE_WRITE i FILE_SHARE_DELETE. Nazwy chyba mówią wszystko.
Najwyraźniej korzystając ze strumieni c++ nie da się tego rozwiązać. Pozostaje tylko przejście do winapi albo wymyślenie innej metody. |
|
steckel Temat założony przez niniejszego użytkownika |
» 2009-09-11 20:44:44 Napisałem sobie obsługę pliku używając WinApi i teraz nie zapisuje kilka pierwszych znaków. Ilość utraconych jest różna. #include <iostream> #include <fstream> #include <conio.h> #include <string> #include <windows.h>
using namespace std;
string text; string pathOfFile; string nick; string message;
void GetWords() { cout << "Wprowadz nick: "; cin >> nick; cout << "Wprowadz temat: "; cin >> pathOfFile; }
void LoadFileEx() { system( "cls" ); LPSTR Bufor; DWORD dwRozmiar, dwPrzeczyt; HANDLE hPlik; hPlik = CreateFile( pathOfFile.c_str(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, 0, NULL ); dwRozmiar = GetFileSize( hPlik, NULL ); Bufor =( LPSTR ) GlobalAlloc( GPTR, dwRozmiar + 1 ); ReadFile( hPlik, Bufor, dwRozmiar, & dwPrzeczyt, NULL ); Bufor[ dwRozmiar ] = 0; text = Bufor; cout << text; GlobalFree( Bufor ); CloseHandle( hPlik ); }
void SaveFileEx() { string txt = text + message; LPSTR Bufor; DWORD dwRozmiar = txt.size(); Bufor =( LPSTR ) GlobalAlloc( GPTR, dwRozmiar + 1 ); Bufor =( LPSTR ) txt.c_str(); DWORD dwZapisane; HANDLE hPlik; hPlik = CreateFile( pathOfFile.c_str(), GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, 0, NULL ); WriteFile( hPlik, Bufor, dwRozmiar, & dwZapisane, NULL ); CloseHandle( hPlik ); }
void Writing() { while( true ) { string say; cout << "[" + nick + "]"; cin >> say; if( say == "#exit" ) { SaveFileEx(); return; } message = "[" + nick + "]" + say + "\n"; SaveFileEx(); LoadFileEx(); } }
int main() { GetWords(); LoadFileEx(); Writing(); }
|
|
DejaVu |
» 2009-09-11 21:06:55 Twój program działa tak: 1) wczytujesz plik 2) czekasz na wprowadzenie tekstu 3) milion innych userów może pisać tekst 4) zapisujesz tekst do pliku, który odczytałeś np. godzinę wcześniej z dodatkowym wierszem - czyli tym co zostało wpisane z klawiatury. Oczywistym jest to, że dane się zgubią. Ponadto jeśli chcesz pobrać długość tekstu używaj metody length(), a nie size(). One nie zwracają tego samego. |
|
steckel Temat założony przez niniejszego użytkownika |
» 2009-09-11 21:18:59 Dzięki! Kod z rozwiązaniem jakby ktoś potrzebował: #include <iostream> #include <fstream> #include <conio.h> #include <string> #include <windows.h>
using namespace std;
string text; string pathOfFile; string nick; string message;
void GetWords() { cout << "Wprowadz nick: "; cin >> nick; cout << "Wprowadz temat: "; cin >> pathOfFile; }
void LoadFileEx() { system( "cls" ); LPSTR Bufor; DWORD dwRozmiar, dwPrzeczyt; HANDLE hPlik; hPlik = CreateFile( pathOfFile.c_str(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, 0, NULL ); dwRozmiar = GetFileSize( hPlik, NULL ); Bufor =( LPSTR ) GlobalAlloc( GPTR, dwRozmiar + 1 ); ReadFile( hPlik, Bufor, dwRozmiar, & dwPrzeczyt, NULL ); Bufor[ dwRozmiar ] = 0; text = Bufor; cout << text; GlobalFree( Bufor ); CloseHandle( hPlik ); }
void SaveFileEx() { string txt = text + message; 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, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, 0, NULL ); WriteFile( hPlik, Bufor, dwRozmiar, & dwZapisane, NULL ); CloseHandle( hPlik ); }
void Writing() { while( true ) { LoadFileEx(); string say; cout << "[" + nick + "]"; cin >> say; if( say == "#exit" ) { SaveFileEx(); return; } message = "[" + nick + "]" + say + "\n"; LoadFileEx(); SaveFileEx(); } }
int main() { GetWords(); LoadFileEx(); Writing(); }
PS. Czym się różni length od size? |
|
lynx |
» 2009-09-11 21:35:14 Lenght zwraca długość string'a, a sizeof zwraca ilość zajmowanej pamięci przez obiekt w wielokrotnościach char(bajtach). Sizeof jest zamieniany na liczbę już w procesie kompilacji.
/edit: Sorry bo tu chyba chodziło o size(), a ja napisałem o sizeof. Choć już sam nie wiem o co tu chodziło. ;p |
|
steckel Temat założony przez niniejszego użytkownika |
» 2009-09-11 22:12:26 Dzięki :D |
|
1 « 2 » |