istream_iterator, dopisywanie do pliku

0
#include <iostream>
#include <fstream>
#include <vector>
#include <iterator>
#include <algorithm>

int main()
{
	std::fstream file("my_file.txt");
	std::vector<double> vec(std::istream_iterator<double> (file), {});
	std::cout << *std::max_element(vec.begin(), vec.end()) << std::endl;
	system("pause");
	return 0;
}

my_file.txt

9022
1
39
20
12901
1089

Mam tu program w C++ do odczytywania z pliku z pliku największej liczby. Tylko ja chciałbym dodać funkcjonalność, żeby do pliku była możliwość dopisywania kolejnych liczb i żeby te dopisywane liczby zachowywały się w pliku na zawsze nie ważne ile razy będę uruchamiał aplikację. Jak to zrobić? Próbowałem wiele razy, ale zawsze kończyło się jakimiś błędami związanymi z tym, że istream_iterator źle odczytywał z pliku i nie przekazywał danych do vectora.

Oto moja próba:

#include <iostream>
#include <fstream>
#include <vector>
#include <iterator>
#include <algorithm>

int main()
{
	std::fstream file("my_file.txt", std::ios::app);
	file << 39 << std::endl;
	file << 89 << std::endl;
	file << 190 << std::endl;
	std::vector<double> vec(std::istream_iterator<double> (file), {});
	std::cout << *std::max_element(vec.begin(), vec.end()) << std::endl;
	system("pause");
	return 0;
}

Wywala wyjątek: vector iterator not deferancable

1

Wywala wyjątek: vector iterator not deferancable

Wywala wyjątek bo std::max_element zwraca vec.end() (co oznacza, że vec jest pusty), a ty próbujesz to wyłuskać przez *.

  1. Jest std::app, a powinno być std::in | std::out.
  2. Te wszytkie file << XXX zapisują na początku pliku a nie na końcu. Żeby dopisywać na końcu (czyli appendować) musisz po otwarciu przesunąć wskaźnik za pomocą seekp i dopiero pisać.
  3. Po dopisaniu musisz wrócić z powrotem na poczatek przez seekg jeśli chcesz załadować cały aktualny content pliku do vec-a.
  4. Stosuj asserty (szczególnie, żeby sprawdzić czy plik się poprawnie otworzył) i zamykaj plik na końcu.

Działający kod:

 
    std::fstream file("my_file.txt", std::fstream::in | std::fstream::out);
    assert(file.good());

    file.seekp(0, file.end);
    file << 39 << std::endl;
    file << 89 << std::endl;
    file << 190 << std::endl;

    file.seekg(0, file.beg);
    const std::vector<double> vec(std::istream_iterator<double> (file), {});
    const auto max_element_it = std::max_element(vec.begin(), vec.end());
    assert(max_element_it != vec.end());

    std::cout << *max_element_it << std::endl;
    file.close();

1 użytkowników online, w tym zalogowanych: 0, gości: 1