Strona 1 z 1

[C++] modyfikacja pliku

: 11 maja 2016, o 11:43
autor: alchem
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?

[C++] modyfikacja pliku

: 11 maja 2016, o 21:23
autor: Andreas
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 << "
";

[C++] modyfikacja pliku

: 11 maja 2016, o 21:51
autor: Afish
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:

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.

[C++] modyfikacja pliku

: 12 maja 2016, o 11:46
autor: alchem
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.