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

[C++, Windows Forms Application] Zapis i odczyt pliku txt

Ostatnio zmodyfikowano 2010-08-25 22:32
Autor Wiadomość
SeaMonster131
Temat założony przez niniejszego użytkownika
[C++, Windows Forms Application] Zapis i odczyt pliku txt
» 2010-08-23 22:14:40
Od niedawna piszę w Visual C++ (Windows Forms Application) i przyszła pora na zapis i odczyt pliku :)
Przeszukałem google i nic nie znalazłem na ten temat, a próbując zrobić to tak jak w konsoli, wyskakują błędy :) (jak ktoś chce moge podać jakie)
Tak więc jak się zapisuje i odczytuje plik tekstowy (Mam np textBox1 i chcę po kliknięciu na przycisk zapisać jego zawartość do pliku)? Kombinowałem kombinowałem i nic nie wykombinowałem :D Proszę Was o pomoc ;)
P-21143
malan
» 2010-08-23 23:25:15
No ok, ale czego nie wiesz?
Tworzysz za pomocą edytora button. Klikasz na niego dwa razy. Następnie MV przenosi Cie do pliku, w którym ujrzysz funkcję, która wykona się po kliknięciu na buttona. W tej funkcji pobierasz tekst z Editboxa, który Cie interesuje- coś w stylu:
C/C++
String ^ myText;
myText = textBox1->Text;
..., następnie konwersja z String^ na np. std::string i dalej
C/C++
SaveToFile( "foo.txt", textFromEditBox );
Amen.
Co do tej konwersji to nie jestem pewny, czy jest konieczna- może MV ma jakąś funkcję zapisującą do pliku. Poszukaj :).
P-21149
SeaMonster131
Temat założony przez niniejszego użytkownika
» 2010-08-24 12:47:27
Nie wiem tylko jak zapisać te dane :)
A te "SaveToFile" to pseudokod może? Bo mi pisze że nie ma takiej funkcji :)
(Jak coś to używam wersji 2008 Visual'a)
P-21156
SeaMonster131
Temat założony przez niniejszego użytkownika
» 2010-08-24 16:08:36
To może ktoś wie jak zapisywać i odczytywać dane z pliku w Visual C++ 2008? :) :) :)
Wiem że istnieje takie coś jak "saveFileDialog" itp ale jeśli tego użyję to program zapyta się mnie gdzie to zapisać (lub odczytać), a mi chodzi o to żeby program zapisał (a później odczytał) to do konkretnego pliku i już :)
P-21158
DejaVu
» 2010-08-24 19:49:16
No jeżeli masz konkretny plik i używasz WinAPI to użyj funkcji WriteFile i analogicznych. Dodam, że niezbyt przyjemnie się z funkcji WinAPI korzysta (tych do obsługi plików) i trochę będziesz musiał poczytać żeby Ci się udało efekt osiągnąć.

MSDN: http://msdn.microsoft.com/en-us/library/aa365747(VS.85).aspx
P-21163
malan
» 2010-08-25 13:09:31
Ciesz się, że wczoraj ujarzmiłem wątki (z małą pomocą ;p) i mam dobry humor.
Specjalnie dla Ciebie ściągnąłem MV i próbowałem rozwiązać Twój problem. Przekopałem trochę (taa, trochę...) msdn i Ci powiem, że tam jest wszystko, czego potrzebujesz do rozwiązania problemu ( + oczywiście logiczne myślenia (którego mi wczoraj o 2 w nocy trochę zbrakło ;p ) ). Do rzeczy. Utworzyłem mały programik, który zapisuje/wczytuje dane do/z pliku.

Funkcja wczytująca dane:
C/C++
private: System::Void button1_Click( System::Object ^ sender, System::EventArgs ^ e )
{
    const int MAX_CHARS_IN_FILE = 1024;
    char buffer[ MAX_CHARS_IN_FILE ] = { '\0' };
    DWORD bytesRead = 0;
    HANDLE fileHandle = NULL;
    String ^ fileName = "";
    String ^ strBuffer = "";
    TCHAR tcharFileName[ MAX_PATH ] = { '\0' };
   
    fileName = textBox2->Text;
    if( fileName->Length <= 0 )
    {
        MessageBox::Show( "Podałeś błędną nazwę pliku!", "Error message!", MessageBoxButtons::OK, MessageBoxIcon::Error );
        return;
    }
   
    for( int i = 0; i < textBox2->TextLength; i++ )
         tcharFileName[ i ] = Convert::ToChar( fileName[ i ] );
   
    fileHandle = CreateFile( tcharFileName,
    GENERIC_READ,
    FILE_SHARE_READ,
    NULL,
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL,
    NULL );
   
    if( fileHandle == INVALID_HANDLE_VALUE )
    {
        _SaveToFile( "errorCode.txt", GetLastError() );
        MessageBox::Show( "Błąd pliku!", "Error message!", MessageBoxButtons::OK, MessageBoxIcon::Error );
        return;
    }
   
    if( !ReadFile( fileHandle, buffer, MAX_CHARS_IN_FILE - 1, & bytesRead, NULL ) )
    {
        _SaveToFile( "errorCode.txt", GetLastError() );
        MessageBox::Show( "Błąd podczas odczytywania danych!", "Error message!", MessageBoxButtons::OK, MessageBoxIcon::Error );
        return;
    }
    CloseHandle( fileHandle );
   
    for( int i = 0; i < strlen( buffer ); i++ ) strBuffer += Char::ToString( buffer[ i ] );
   
    textBox1->Text = strBuffer;
    return;
};
Funkcja zapisująca dane:
C/C++
private: System::Void button2_Click( System::Object ^ sender, System::EventArgs ^ e )
{
    const int MAX_CHARS_IN_FILE = 1024;
    char buffer[ MAX_CHARS_IN_FILE ] = { '\0' };
    DWORD bytesWrite = 0;
    HANDLE fileHandle = NULL;
    int charsCount = 0;
    String ^ fileName = "";
    String ^ strBuffer = "";
    TCHAR tcharFileName[ MAX_PATH ] = { '\0' };
   
    fileName = textBox2->Text;
    if( fileName->Length <= 0 )
    {
        MessageBox::Show( "Podałeś błędną nazwę pliku!", "Error message!", MessageBoxButtons::OK, MessageBoxIcon::Error );
        return;
    }
    for( int i = 0; i < textBox2->TextLength; i++ )
         tcharFileName[ i ] = Convert::ToChar( fileName[ i ] );
   
    strBuffer = textBox1->Text;
    charsCount = strBuffer->Length;
    if( charsCount <= 0 ) return;
   
    for( int i = 0; i < charsCount; i++ )
         buffer[ i ] = Convert::ToChar( strBuffer[ i ] );
   
    fileHandle = CreateFile( tcharFileName,
    GENERIC_WRITE,
    FILE_SHARE_WRITE,
    NULL,
    TRUNCATE_EXISTING,
    FILE_ATTRIBUTE_NORMAL,
    NULL );
   
    if( fileHandle == INVALID_HANDLE_VALUE )
    {
        _SaveToFile( "errorCode.txt", GetLastError() );
        MessageBox::Show( "Błąd pliku!", "Error message!", MessageBoxButtons::OK, MessageBoxIcon::Error );
        return;
    }
   
    if( !WriteFile( fileHandle, buffer, charsCount, & bytesWrite, NULL ) )
    {
        _SaveToFile( "errorCode.txt", GetLastError() );
        MessageBox::Show( "Błąd podczas zapisywania danych!", "Error message!", MessageBoxButtons::OK, MessageBoxIcon::Error );
        return;
    }
    CloseHandle( fileHandle );
   
    MessageBox::Show( "Operacja zakończona pomyślnie!", "Jupi message!", MessageBoxButtons::OK, MessageBoxIcon::Error );
    return;
};
Na pewno są w tym kodzie błędy, które dotyczą konwersji danych..., ale działa :). Coś już masz :). Jak trochę dopracujesz może coś z tego być :D.
Tutaj masz cały program do ściągnięcia: Download (chomikuj.pl)
Hasło (na wszelki wypadek): promalan
Mam nadzieję, że pomogłem :).
P-21177
SeaMonster131
Temat założony przez niniejszego użytkownika
» 2010-08-25 13:51:34
@malan - naprawdę dzięki za poświęcony czas! :)
Niestety nie mogę teraz przetestować ani kodu ani programu, ale wieczorem na pewno zobaczę ;)
Jeszcze raz dzięki! :D
P-21183
malan
» 2010-08-25 22:32:54
@SeaMonster131: Zapomnij o tych dwóch funkcjach wyżej ;p. Ja się do nich nie przyznaje... Są o wiele lepsze rozwiązania:
C/C++
// Wczytywanie danych
private: System::Void button1_Click( System::Object ^ sender, System::EventArgs ^ e )
{
    String ^ fileName = "",
    ^ buffor = "",
    ^ readDate = "";
   
    fileName = textBox2->Text;
    if( !File::Exists( fileName ) )
    {
        MessageBox::Show( "Podałeś błędną nazwę pliku!", "Error message!", MessageBoxButtons::OK, MessageBoxIcon::Error );
        return;
    }
   
    StreamReader ^ sr = File::OpenText( fileName );
    try
    {
        while( buffor = sr->ReadLine() )
        {
            readDate += buffor + "\r\n";
        }
    }
    finally
    {
        textBox1->Text = readDate;
        sr->Close();
    }
   
    return;
};

// Zapisywanie danych
private: System::Void button2_Click( System::Object ^ sender, System::EventArgs ^ e )
{
    String ^ fileName = "";
   
    fileName = textBox2->Text;
    if( File::Exists( fileName ) )
    {
        MessageBox::Show( "Plik już istnieje!", "Error message!", MessageBoxButtons::OK, MessageBoxIcon::Error );
        return;
    }
   
    StreamWriter ^ sw = File::CreateText( fileName );
    try
    {
        sw->WriteLine( textBox1->Text );
    }
    finally
    {
        sw->Close();
    }
   
    return;
};
Ten kod jest niedorobiony- trzeba dopisać obsługę wyjątków.
P-21244
« 1 »
  Strona 1 z 1