Witam.
Mój program jest bardzo prosty. Służy ćwiczeniu, więc niektóre rzeczy można by napisać dużo prościej, ale nie o to tu chodzi. Dla jasności wkleję polecenie:
Napisz program, który jest 200 elementowa tablica obiektów typu double. Poszczególne elementy tej tablicy są wielokrotnością liczby 0,01. Tzn.: 0,01, 0,02, 0,03. Następnie niech program zapisze do pliku binarnego (funkcją write) wartości z tej 200 elementowej tablicy, a tablicę wyzeruje. Następnie niech program zapyta użytkownika o numer elementu tablicy, który chciałby poznać. jeśli użytkownik odpowie, że na przykład 173, pozycjonuj odpowiednio wskaźnik do czytania, przeczytaj tę liczbę, wstaw do tablicy we właściwe miejsce i pokaż tę liczbę na ekranie po to, by się przekonać, czy operacja Ci się udała. (Powinieneś wtedy zobaczyć wartość 1,73)
Jak już mówiłem, program krótki i raczej prosty. Oto mój kod:
#include <iostream>
#include <fstream>
#include <sstream>
using namespace std;
int main()
{
const int rozmiar = 200;
double liczby[rozmiar];
for(int i = 0; i < rozmiar; i++) liczby[i] = (0.01 * i);
ofstream plik("liczby.txt", ios::out | ios::binary);
for(int i = 0; i < rozmiar; i++)
{
string tymczasowy;
ostringstream strumien(tymczasowy);
strumien << liczby[i];
string wypis = strumien.str();
//cout << wypis << endl; Dzięki tej instrukcji przekonałem się, że problem tkwi w funkcji write().
plik.write(wypis.c_str(), sizeof(double));
liczby[i] = 0; // ZEROWANIE
}
//////// ROZMOWA Z UŻYTKOWNIKIEM ////////
while(1)
{
string nazwa = "liczby.txt";
ifstream plik(nazwa.c_str(), ios::in | ios::binary);
if(!plik) // Sprawdzamy poprawnoϾ
{
cout << "Blad przy probie otwarcia pliku: " << nazwa << '!';
break;
}
int index;
cout << "Podaj numer elementu tablicy (0-199): ";
cin >> index;
if(index > -1 && index < 200)
{
plik.seekg(sizeof(double) * index);
plik >> liczby[index];
cout << "Wartosc przechowywana w tym miejscu tablicy: " << liczby[index] << endl;
}
else cout << "Niepoprawny index! Wprowadz liczbe z przedzialu 0-199." << endl;
}
}
Skompilujcie, jeśli możecie i wpiszcie liczbę większą niż 191 (i mniejszą niż 200). Jeśli wyświetli 0, to macie tak jak ja... Program działa prawidłowo, ale tylko dla liczb mniejszych niż 192... Czemu? Wiem przynajmniej gdzie się sypie. Po prostu te liczby (192, 193 itd.) nie są zapisywane do pliku. Dlaczego? Przecież według zasady, którą wyczytałem w książce Jerzego Grębosza obiekt double zawsze ma wielkość sizeof(double)...