Dziwne zachowanie klasy z plikiem
Ostatnio zmodyfikowano 2014-06-01 14:53
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 #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 #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 ) ); 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 ) { a = obiekt.a; return * this; }
plik main.cpp #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; return 0; }
|
|
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. |
|
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)..? Hard_Array & operator =( Hard_Array obiekt );
|
To jest niepoprawne. zapomniałeś użyć funkcji c_str() |
Po co? |
|
Jacob99 |
» 2014-06-01 12:57:42 Bo do otwarcia pliku jest potrzebny łańcuch znaków w stylu C ? |
|
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. |
|
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. |
|
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 |
|
« 1 » |