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 ;) |
|
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: String ^ myText; myText = textBox1->Text;
..., następnie konwersja z String^ na np. std::string i dalej 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 :). |
|
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) |
|
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ż :) |
|
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 |
|
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: 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: 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): promalanMam nadzieję, że pomogłem :). |
|
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 |
|
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: 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; };
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. |
|
« 1 » |