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

Dziwne zachowanie klasy z plikiem

Ostatnio zmodyfikowano 2014-06-01 14:53
Autor Wiadomość
patrakus
Temat założony przez niniejszego użytkownika
Dziwne zachowanie klasy z plikiem
» 2014-06-01 02:08:11
Witam. Napisałem klasę która przechowuje swoje dane do pliku w postaci binarnej, ale jest problem z odczytem tych danych z powrotem. Jak program pierwszy raz stworzy plik to potem ma problem z odczytem ostatniego wpisu jaki był tam dokonany, a jak ponownie uruchomię program to już tego problemu nie ma. Wie ktoś może co jest tego przyczyną i jak temu zaradzić?

plik Hard_Array.h
C/C++
#pragma once
#include<fstream>
#include<string>
#include<iostream>

using namespace std;

enum typ {
    shrint,
    integer,
    longint,
    floa,
    doubl
};

class Hard_Array
{
private:
   
   
    int a;
    int indeks;
   
   
    bool Is_shortint;
    bool Is_int;
    bool Is_long_int;
    bool Is_float;
    bool Is_double;
   
    ifstream read;
    ofstream save;
public:
    Hard_Array( string file_name, typ type );
    ~Hard_Array();
   
    int & operator []( int indeks_drugi );
    int & operator =( int liczba );
    Hard_Array & operator =( Hard_Array obiekt );
};

plik Hard_Array.cpp
C/C++
#include "Hard_Array.h"


Hard_Array::Hard_Array( string file_name, typ type )
{
    if( type = shrint )
    {
        Is_shortint = true;
        Is_int = false;
        Is_long_int = false;
        Is_float = false;
        Is_double = false;
    }
    else if( type = integer )
    {
        Is_shortint = false;
        Is_int = true;
        Is_long_int = false;
        Is_float = false;
        Is_double = false;
    }
    else if( type = longint )
    {
        Is_shortint = false;
        Is_int = false;
        Is_long_int = true;
        Is_float = false;
        Is_double = false;
    }
    else if( type = floa )
    {
        Is_shortint = false;
        Is_int = false;
        Is_long_int = false;
        Is_float = true;
        Is_double = false;
    }
    else if( type = doubl )
    {
        Is_shortint = false;
        Is_int = false;
        Is_long_int = false;
        Is_float = false;
        Is_double = true;
    }
   
    indeks = 1;
   
    read.open( file_name, ios::binary | ios::app );
    save.open( file_name, ios::binary | ios::app );
}


Hard_Array::~Hard_Array()
{
    read.close();
    save.close();
}

int & Hard_Array::operator []( int indeks_drugi )
{
    read.seekg( 4 *( indeks_drugi ) );
    int t = read.tellg();
    t = read.rdstate();
    read.read(( char * ) & a, sizeof( a ) );
    t = read.rdstate();
    read.clear();
    t = read.tellg();
    t = read.rdstate();
    indeks_drugi = a;
   
    return indeks_drugi;
}

int & Hard_Array::operator =( int liczba )
{
    a = liczba;
   
    read.seekg( 4 *( indeks ) );
    save.seekp( 4 *( indeks ) );
    int t = read.tellg();
    int tt = save.tellp();
   
    int i = 0;
    read.read(( char * ) & i, sizeof( a ) ); //musi byc wykonana operacja odczytu ze strumienia aby mozna bylo otrzymac flage konca pliku
   
    if( read.eof() )
    {
       
        save.write(( char * ) & a, sizeof( a ) );
    }
    else
    {
        a = i;
    }
    read.clear();
    save.clear();
    t = read.rdstate();
    indeks++;
   
    return liczba;
}

Hard_Array & Hard_Array::operator =( Hard_Array obiekt ) // przypisanie do kladowej klasy z drugiej skladowej klasy
{
    a = obiekt.a;
    return * this; //zwracamy adres obiektu
}

plik main.cpp
C/C++
#include"Hard_Array.h"

int main()
{
    Hard_Array H_A( "integer.txt", integer );
   
    H_A = 3;
    H_A = 2;
    H_A = 55;
    H_A = 33;
   
    cout << H_A[ 0 ] << endl;
    cout << H_A[ 1 ] << endl;
    cout << H_A[ 2 ] << endl;
    cout << H_A[ 3 ] << endl; //tu juz przy pierwszym razie pokazuje 55 a nie 33
   
    return 0;
}

P-111237
Jacob99
» 2014-06-01 09:04:48
W linijkach 49 i 50 w Hard_array.cpp zapomniałeś użyć funkcji c_str() i nie dołączyłeś nagłówka string.
P-111238
pekfos
» 2014-06-01 12:02:13
Hard_array.cpp, linie 6-45: Operatory.. A całość można by zapisać w kilku liniach.
Nie sprawdzasz, czy pliki udało się otworzyć.
Po co to wszystko w operator=(int)..?

C/C++
Hard_Array & operator =( Hard_Array obiekt );
To jest niepoprawne.

zapomniałeś użyć funkcji c_str()
Po co?
P-111240
Jacob99
» 2014-06-01 12:57:42
Bo do otwarcia pliku jest potrzebny łańcuch znaków w stylu C ?
P-111243
patrakus
Temat założony przez niniejszego użytkownika
» 2014-06-01 13:25:11
Użycie c_str() nic nie zmienia, a nagłówek string jest w pliku Hard_Array.h. Pliku nie sprawdzam, czy udało się utworzyć bo po prostu na tym etapie tworzenia klasy nie widziałem potrzeby.
P-111246
pekfos
» 2014-06-01 14:50:16
Bo do otwarcia pliku jest potrzebny łańcuch znaków w stylu C ?
No tak, ale co to ma do rzeczy tu..? Może być wskaźnik jak i std::string podany.
P-111249
ison
» 2014-06-01 14:53:22
Bo do otwarcia pliku jest potrzebny łańcuch znaków w stylu C ?
Od C++11 można przekazać std::string
P-111250
« 1 »
  Strona 1 z 1