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

Jednoczesna obługa pliku tekstowego kilku programów.

Ostatnio zmodyfikowano 2009-09-11 22:12
Autor Wiadomość
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.
P-10159
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.
P-10160
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.
C/C++
#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();
}
P-10172
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.
P-10174
steckel
Temat założony przez niniejszego użytkownika
» 2009-09-11 21:18:59
Dzięki!
Kod z rozwiązaniem jakby ktoś potrzebował:
C/C++
#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?
P-10175
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
P-10176
steckel
Temat założony przez niniejszego użytkownika
» 2009-09-11 22:12:26
Dzięki :D
P-10177
1 « 2 »
Poprzednia strona Strona 2 z 2