• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zapis do i odczyt z pliku

42 Warsaw Coding Academy
0 głosów
299 wizyt
pytanie zadane 24 maja 2016 w C i C++ przez Kacperos_89 Początkujący (400 p.)

Cześć :)

Potrzebna mi pomoc, napisałem program który powinien odczytać plik wykonać odejmowanie na dwóch zmiennych i zapisać pliki z powrotem, następnie mam możliwość wybrania następnego pliku i to samo zadanie niestety coś idzie źle. Wygląda to tak jak by wczytał plik zrobił obliczenia ale nie zamknął i nie zapisał wcześniej otworzonego pliku.

 

Kod wygląda tak:


#include <iostream>
#include <unistd.h>
#include <fstream>
#include <sstream>
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>

using namespace std;

int hash;
fstream plik;
stringstream ss;
string temp_nazwa_pliku;

int main()
{
	for(;;)
	{
		cout << "podaj nazwe pliku" << endl;
		cin >> hash;
	
		string k_imie, k_rasa;
		int kg, dawki;
		int kg2, dawki2;
		
		ss << hash;
		ss >> temp_nazwa_pliku;

		const char * nazwa_pliku = temp_nazwa_pliku.c_str();

		plik.open(nazwa_pliku, ios::in | ios::out);

		if(plik.good()==false)
		{
			cout << "Brak Pliku" << endl;
		}

		string linia;
		int nr_linii = 1;
		
		while(getline(plik,linia))
		{
			switch(nr_linii)
			{
				case 1:
					break;
				case 2:
					k_imie = linia;
					break;
				case 3:
					k_rasa = linia;
					break;
				case 4:
					kg = atoi(linia.c_str());
					break;
				case 5: 
					dawki = atoi(linia.c_str());
					break;
			}
			nr_linii++;
		}
		cout << k_imie << endl;
		cout << k_rasa << endl;
		cout << kg << endl;
		cout << dawki << endl;

		if (dawki < 1)
		{
			cout << "Dawki sie skonczyly" << endl;

			plik.close();
			plik.clear();
		}
		else
		{
			kg2 = kg - 2;
			dawki2 = dawki - 1;

			plik << hash << endl;
			plik << k_imie << endl;
			plik << k_rasa << endl;
			plik << kg2 << endl;
			plik << dawki2 << endl;

			cout << "Zapisuje: "<< hash << endl;
			cout << k_imie << endl;
			cout << k_rasa << endl;
			cout << kg2 << endl;
			cout << dawki2 << endl;

			plik.close();
			plik.clear();	
		}
	}
	return 0;
}

Pliki wyglądają w taki sposób:

I tak jak pisałem program wczytuje wybrany plik odejmuje prawidłowo i jak chcę wykonać jeszcze raz tą samom operacje na tym samym pliku to wczytane wartości nie są pomniejszone o ostatnią operacje ale wczytuje wartość początkową tych wartości. Gdy wczytuje drugi plik to program tak jak by mnie olewa i dalej wyświetla wartości z pliku który wczytałem jako pierwszy.

Rad bym był przeczytać rozwiązanie mojego problemu. Jeżeli podałem za mało informacji albo opisałem je zbyt zawile to obiecuje w miarę szybko odpowiedzieć na dodatkowe pytania :)

Pozdrawiam Kacperos_89

2 odpowiedzi

+1 głos
odpowiedź 24 maja 2016 przez Mya Bywalec (2,790 p.)
edycja 25 maja 2016 przez Mya
 
Najlepsza

Przed rozpoczęciem zapisywania do pliku (tj. w linii 80) wyczyść flagi oraz wróć na początek pliku:

plik.clear();
plik.seekp(1, std::ios::beg);

Więcej o seekp: http://www.cplusplus.com/reference/ostream/ostream/seekp/

Zwróć również uwagę na fakt, że cała zawartość pętli jest wykonywana nawet gdy podana zostanie błędna nazwa pliku. To powoduje wypisanie na ekran losowych wartości lub wartości wpisanych do zmiennych w poprzednim obiegu. Po linii 36. pewnie przydałoby się wstawić continue.

 

edit:

Pobieranie nazwy pliku z ss również powoduje dotarcie do EOF, więc flagi w tym strumieniu też należy wyczyścić.

ss.clear();
0 głosów
odpowiedź 25 maja 2016 przez Kacperos_89 Początkujący (400 p.)
Dziękuję bardzo, zapisywanie po wykonanym odejmowaniu działa bardzo dobrze tak jak wykrywanie czy plik istnieje :) niestety nie rozwiązuje to wszystkich problemów. Wciąż jest problem z wczytywaniem, gdy wczytam pierwszy plik to cały program się wykonuje się tylko w nim. Wczytam plik 1 odejmie i prosi o wczytanie następnego pliku i teraz nieważne jaki plik wybiorę czy jest to plik 2 czy plik który nie istnieje to kolejne odejmowanie wykona się w pliku 1. Gdy karzę wczytać plik który nie istnieje poda komunikat "Brak Pliku", teraz już nic się nie wyświetli, ale jak będę chciał wczytać tym razem plik istniejący to zareaguje tak samo jak by ten plik nie istniał.
komentarz 25 maja 2016 przez Mya Bywalec (2,790 p.)
Dodałam rozwiązanie w mojej odpowiedzi.
komentarz 25 maja 2016 przez Kacperos_89 Początkujący (400 p.)
Dziękuję Ci bardzo jeszcze raz, teraz już wszystko działa :)

Podobne pytania

0 głosów
2 odpowiedzi 1,713 wizyt
pytanie zadane 14 maja 2016 w C i C++ przez Evelek Nałogowiec (28,960 p.)
0 głosów
1 odpowiedź 2,571 wizyt
pytanie zadane 12 października 2016 w PHP przez Ditrix Mądrala (5,650 p.)
0 głosów
2 odpowiedzi 680 wizyt
pytanie zadane 28 lipca 2016 w PHP przez rucin96 Użytkownik (500 p.)

93,383 zapytań

142,382 odpowiedzi

322,539 komentarzy

62,744 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...