• 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

Object Storage Arubacloud
0 głosów
227 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,466 wizyt
pytanie zadane 14 maja 2016 w C i C++ przez Evelek Nałogowiec (28,960 p.)
0 głosów
1 odpowiedź 2,263 wizyt
pytanie zadane 12 października 2016 w PHP przez Ditrix Mądrala (5,650 p.)
0 głosów
2 odpowiedzi 557 wizyt
pytanie zadane 28 lipca 2016 w PHP przez rucin96 Użytkownik (500 p.)

92,555 zapytań

141,404 odpowiedzi

319,560 komentarzy

61,941 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...