[C++] modyfikacja pliku

Awatar użytkownika
alchem
Użytkownik
Użytkownik
Posty: 252
Rejestracja: 10 cze 2014, o 19:10
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 83 razy
Pomógł: 5 razy

[C++] modyfikacja pliku

Post autor: alchem » 11 maja 2016, o 11:43

Mam zmodyfikować, plik, z danymi w którym są ceny i zapisac w nowym pliku z ceną śrdenią:
np
118.80 118.60
118.40 118.20
117.40 115.70
115.10 115.85
115.85 112.20
112.30 111.60
112.30 114.10
113.00 114.50
114.50 113.75
114.00 113.80
114.45 113.80
114.50 113.50
114.15 113.70
113.70 114.20
113.70 113.50





Kod wygląda tak: [edit]

Kod: Zaznacz cały

int modyfikacja_liczb(std:: string nazwa_pliku)
{
    std::ifstream plik (nazwa_pliku.c_str());
    float ceny1[1000]; //poczatek
    float ceny2[1000]; //koniec
    float ceny3[1000]; //srednia
    int licznik_glowny = 0;
    int licznik_pomocniczy1 = 0;
    int licznik_pomocniczy2 = 0;

    if(!(plik))
    {
        std::cout << "Nie ma takiego pliku lub nie masz do niego dostepu! "<<std::endl;
        return -1;
    }


    else
    {
        std::cout << "Udalo sie otworzyc plik"<<std::endl;

        while(!(plik.eof()))
        {

            if( licznik_glowny%2 == 0 )
            {
                plik >> ceny1[licznik_pomocniczy1];  //zwraca -1 jak nie jest liczba
                licznik_pomocniczy1++;
            }
            if( licznik_glowny%2 == 1 )
            {
                plik >> ceny2[licznik_pomocniczy2]; //zwraca -1 jak nie jest liczba
                licznik_pomocniczy2++;
            }

            licznik_glowny++;
        }

       if((licznik_glowny-1)%2 != 0) return -1;    // sprawdzacz czy ilosc plikow jest parzysta, czyli czy nie brakuje 1 danej np
    }


    for(int i = 0; i <= licznik_pomocniczy1-2; i++)
    {
        ceny3[i] = (ceny1[i] + ceny2[i])/2;
    }

std::cout << "Podaj w jakim pliku chcesz zapisac nowe dane: ";
std::string nazwa;
std::cin >> nazwa;
std::ofstream plik2(nazwa.c_str());
for(int k =0;k <= licznik_pomocniczy1-2 ;k++)
  {
    plik2 << ceny1[k] << " " << ceny2[k] << " " <<ceny3[k]<<std::endl;
  }


}

W kodzie chce sprawdzić, czy ilość cen jest parzysta, oraz czy jest to wgl liczba: tzn

Kod: Zaznacz cały

  if(!(plik >> ceny1[licznik_pomocniczy1])) return -1;

Ale z tym wywala mi -1 jeśli zamiast tego zrobię tak:

Kod: Zaznacz cały

  plik >> ceny1[licznik_pomocniczy1];
to wszystko jest ok, ale wtedy nie wyłapie czegoś co liczbą nie jest. Prędzej robiłem metodą pierwszą w innym zadaniu i było ok, jedyna róznica że wtedy pracowałem na intach, wie ktoś co jest nie tak?

Oraz jedno drobne pytanie dlaczego zmienna_pomocnicza1 oraz zmienna_pomocnicza2 różnią się o 1?

Andreas
Użytkownik
Użytkownik
Posty: 1130
Rejestracja: 1 lis 2008, o 22:33
Płeć: Mężczyzna
Podziękował: 72 razy
Pomógł: 156 razy

[C++] modyfikacja pliku

Post autor: Andreas » 11 maja 2016, o 21:23

Po co w ogóle ci tablice? Możesz przecież odczytywać i od razu zapisywać do pliku. Trzecia tablica jest kompletnie niepotrzebna. Zamiast pisać

Kod: Zaznacz cały

for(int i = 0; i <= licznik_pomocniczy1-2; i++)
    {
        ceny3[i] = (ceny1[i] + ceny2[i])/2;
    }
for(int k =0;k <= licznik_pomocniczy1-2 ;k++)
  {
    plik2 << ceny1[k] << " " << ceny2[k] << " " <<ceny3[k]<<std::endl;
  }
Możesz przecież od razu liczyć średnią.

Kod: Zaznacz cały

for(int k =0;k <= licznik_pomocniczy1-2 ;k++)
  {
    plik2 << ceny1[k] << " " << ceny2[k] << " " <<(ceny1[i] + ceny2[i])/2<<std::endl;
  }
Te tablice nie są potrzebne, można tak:

Kod: Zaznacz cały

double cena1, cena2;
while (plik >> cena1 >> cena2)
   plik2 << cena1 << " " << cena2 << " " << (cena1+cena2)/2 << "
";

Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[C++] modyfikacja pliku

Post autor: Afish » 11 maja 2016, o 21:51

Jak już się bawimy w skracanie kodu, to — przy założeniu, że dane są poprawne i ceny różne od zera — można tak: http://ideone.com/Tskd9q

Kod: Zaznacz cały

#include <iostream>
#include <functional>
#include <iterator>
#include <numeric>
using namespace std;

int main() {
	accumulate(istream_iterator<double>(cin), istream_iterator<double>(), 0, [](int a, int b) -> auto { return a ? (cout<<(a + b)/2.0<<endl, 0) : b;});
	return 0;
}
Zamiast cin i cout można wstawić strumienie do plików.

Awatar użytkownika
alchem
Użytkownik
Użytkownik
Posty: 252
Rejestracja: 10 cze 2014, o 19:10
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 83 razy
Pomógł: 5 razy

[C++] modyfikacja pliku

Post autor: alchem » 12 maja 2016, o 11:46

Fakt, można to zrobić szybciej, no ale problem pozostaje, mój kod wykrywa kiedy nie ma tam np jednej ceny, ale jeśli nie będzie dwóch to program tego nie zauważy, tak samo nie zadziała kiedy coś nie jest liczbą, bo

Kod: Zaznacz cały

if(!(plik >> ceny1[licznik_pomocniczy1])) return -1;
Wywala mi -1 nawet w dobrym pliku, tylko że nie wiem dlaczego.

ODPOWIEDZ