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

pobieranie danych z pliku.txt

Ostatnio zmodyfikowano 2024-01-20 22:40
Autor Wiadomość
E_Rysiek
Temat założony przez niniejszego użytkownika
pobieranie danych z pliku.txt
» 2024-01-18 18:17:44
aplikację utworzyłem w Visyal C++ 2005
po uruchomieniu programu działa button1 - tworzy plik.txt, a po naciśnięciu button2 powinien wpisać liczby do texBox1, niestety zamyka się program i wyskakuje okno dialogowe "Microsoft Visual Studio" z następującym tekstem:

An unhandled exception of type 'System.ArgumentException' occurred in mscorlib.dll

Additional information: The output char buffer is too small to contain the
decoded characters, encoding 'Unicode (UTF-8)' fallback
'System.Text.DecoderReplacementFallback'.


a na dole ekranu Visual C++2005, w oknie "Call Stack" jest podświetlona linia:
Test 67.exe!Test67::Form1::button2_Click(System::Object^ sender = 0x0012ed38, System::EventArgs^ e = 0x0012ed44) Line 129 + 0x8 bytes C++

w oknie "Debug" są następujące zapisy:
'Test 67.exe' (Managed): Loaded 'D:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll', No symbols loaded.
'Test 67.exe' (Managed): Loaded 'd:\cc8\test 67\debug\Test 67.exe', Symbols loaded.
'Test 67.exe' (Managed): Loaded 'D:\WINDOWS\WinSxS\x86_Microsoft.VC80.DebugCRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_f75eb16c\msvcm80d.dll', Symbols loaded.
'Test 67.exe' (Managed): Loaded 'D:\WINDOWS\assembly\GAC_MSIL\System\2.0.0.0__b77a5c561934e089\System.dll', No symbols loaded.
'Test 67.exe' (Managed): Loaded 'D:\WINDOWS\assembly\GAC_MSIL\System.Windows.Forms\2.0.0.0__b77a5c561934e089\System.Windows.Forms.dll', No symbols loaded.
'Test 67.exe' (Managed): Loaded 'D:\WINDOWS\assembly\GAC_MSIL\System.Drawing\2.0.0.0__b03f5f7f11d50a3a\System.Drawing.dll', No symbols loaded.
A first chance exception of type 'System.ArgumentException' occurred in mscorlib.dll
A first chance exception of type 'System.ArgumentException' occurred in mscorlib.dll
An unhandled exception of type 'System.ArgumentException' occurred in mscorlib.dll

Additional information: The output char buffer is too small to contain the decoded characters, encoding 'Unicode (UTF-8)' fallback 'System.Text.DecoderReplacementFallback'.

The program '[3528] Test 67.exe: Managed' has exited with code -532459699 (0xe0434f4d).

plik Form1.h
C/C++
#pragma once


namespace Test67 {
   
   
using namespace System;
   
using namespace System::ComponentModel;
   
using namespace System::Collections;
   
using namespace System::Windows::Forms;
   
using namespace System::Data;
   
using namespace System::Drawing;
   
using namespace System::IO; //dopisane
   
    /// <summary>
    /// Summary for Form1
    ///
    /// WARNING: If you change the name of this class, you will need to change the
    ///          'Resource File Name' property for the managed resource compiler tool
    ///          associated with all .resx files this class depends on.  Otherwise,
    ///          the designers will not be able to interact properly with localized
    ///          resources associated with this form.
    /// </summary>
   
public ref class Form1
: public System::Windows::Forms::Form
    {
   
public:
       
Form1( void )
       
{
           
InitializeComponent();
           
//
            //TODO: Add the constructor code here
            //
       
}
       
   
protected:
       
/// <summary>
        /// Clean up any resources being used.
        /// </summary>
       
~Form1()
       
{
           
if( components )
           
{
               
delete components;
           
}
        }
   
private: System::Windows::Forms::Button ^ button1;
   
private: System::Windows::Forms::Button ^ button2;
   
private: System::Windows::Forms::TextBox ^ textBox1;
   
protected:
       
   
private:
       
/// <summary>
        /// Required designer variable.
        /// </summary>
       
System::ComponentModel::Container ^ components;
       
       
#pragma region Windows Form Designer generated code
       
/// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
       
void InitializeComponent( void )
       
{
           
this->button1 =( gcnew System::Windows::Forms::Button() );
           
this->button2 =( gcnew System::Windows::Forms::Button() );
           
this->textBox1 =( gcnew System::Windows::Forms::TextBox() );
           
this->SuspendLayout();
           
//
            // button1
            //
           
this->button1->Location = System::Drawing::Point( 21, 188 );
           
this->button1->Name = L"button1";
           
this->button1->Size = System::Drawing::Size( 65, 66 );
           
this->button1->TabIndex = 0;
           
this->button1->Text = L"Zapis do pliku";
           
this->button1->UseVisualStyleBackColor = true;
           
this->button1->Click += gcnew System::EventHandler( this, & Form1::button1_Click );
           
//
            // button2
            //
           
this->button2->Location = System::Drawing::Point( 113, 188 );
           
this->button2->Name = L"button2";
           
this->button2->Size = System::Drawing::Size( 75, 66 );
           
this->button2->TabIndex = 1;
           
this->button2->Text = L"Odczyt z pliku";
           
this->button2->UseVisualStyleBackColor = true;
           
this->button2->Click += gcnew System::EventHandler( this, & Form1::button2_Click );
           
//
            // textBox1
            //
           
this->textBox1->Location = System::Drawing::Point( 15, 15 );
           
this->textBox1->Multiline = true;
           
this->textBox1->Name = L"textBox1";
           
this->textBox1->Size = System::Drawing::Size( 250, 150 );
           
this->textBox1->TabIndex = 2;
           
//
            // Form1
            //
           
this->AutoScaleDimensions = System::Drawing::SizeF( 6, 13 );
           
this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
           
this->ClientSize = System::Drawing::Size( 292, 266 );
           
this->Controls->Add( this->textBox1 );
           
this->Controls->Add( this->button2 );
           
this->Controls->Add( this->button1 );
           
this->Name = L"Form1";
           
this->Text = L"Form1";
           
this->ResumeLayout( false );
           
this->PerformLayout();
           
       
}
       
#pragma endregion
   
private: System::Void button1_Click( System::Object ^ sender, System::EventArgs ^ e )
       
{
           
System::Single liczba_single;
           
FileStream ^ plik_zap = File::Create( "C:\\Plik1.txt" );
           
BinaryWriter ^ plik_dane_zap = gcnew BinaryWriter( plik_zap );
           
liczba_single = 123.45;
           
plik_dane_zap->Write( liczba_single );
           
liczba_single = 456.78;
           
plik_dane_zap->Write( liczba_single );
           
liczba_single = 987.34;
           
plik_dane_zap->Write( liczba_single );
           
plik_zap->Close();
       
}
   
private: System::Void button2_Click( System::Object ^ sender, System::EventArgs ^ e )
       
{
           
System::Single liczba_single;
           
FileStream ^ plik_odcz = File::OpenRead( "C:\\Plik1.txt" );
           
BinaryReader ^ plik_dane_odcz = gcnew BinaryReader( plik_odcz );
           
while( plik_dane_odcz->PeekChar() != - 1 )
           
{
               
liczba_single = plik_dane_odcz->ReadSingle();
               
textBox1->AppendText( liczba_single.ToString() + System::Environment::NewLine );
           
}
           
plik_odcz->Close();
       
}
    }
;
}
Proszę o pomoc
P-180585
pekfos
» 2024-01-18 19:32:30
PeekChar nie ma sensu w tym kontekście. Piszesz do pliku floaty binarnie, a próbujesz to interpretować jako tekst w UTF-8.
P-180586
E_Rysiek
Temat założony przez niniejszego użytkownika
» 2024-01-20 12:05:19
przykład tej aplikacji jest z książki, a ja jako początkujący jeszcze nie mama tak szerokiej wiedzy aby to poprawić,
więc mam pytanie jak powinien być zapisany ten wiersz

 while( plik_dane_odcz->PeekChar() != - 1 )
P-180588
pekfos
» 2024-01-20 16:40:58
Może tak, ale nie wiem czy dobrze przepisałem z C# na "C++".
C/C++
while( plik_dane_odcz->BaseStream->Position != plik_dane_odcz->BaseStream->Length )
   
https://stackoverflow.com/questions/10942848/c-sharp-checking-for-binary-reader-end-of-file
P-180589
E_Rysiek
Temat założony przez niniejszego użytkownika
» 2024-01-20 22:40:58
Dziękuję bardzo za pomoc, wszystko działa.
P-180590
« 1 »
  Strona 1 z 1