Zamiana komendy z wykorzystaniem ifstream


(Sylwia K) #1

Witam,

no forum jestem po raz pierwszy i zwracam się z prośbą o pomoc, mianowice zbliża się temat oddania programu na zaliczenie, z którym mam problem - program nie ukrywając, odziedziczyłam po starszym koledze, jednak mój prowadzący poprosił mnie o zmianę komendy odczytywania danych z pliku, twierdząc, że jest ona zbyt trudna. Podał mi dwa schematy komend, z których mam wybrać jedną:

1) ifstream nazwa_strumienia ("ścieżka/nazwa pliku");

    while (!nazwa_strumienia.eof())

    {

    ...

    nazwa_strumienia >> ...

    ...

    }

2) lub komende z wykorzystaniem w drugiej linijce zapisu: while (getline(nazwa_strumienia,nazwa_zmiennej_typu_łańcuchowego))

 

Niestety totalnie nie wiem jak podmienić owe komendy, aby program działał. Swoje dane zapisane miałam w kolumanch pionowych, a poproszono mnie, aby zapisać je w kolumnach poziomych. Czy mógłby mi ktoś pomóc? Jest to program umożliwiający między innymi obliczanie regresji liniowej.

 

PS. Po konsultacji z prowadzącym, nie jest konieczne wyświetlanie tabeli, wystarczy jeśli program pobierze dane z pliku.

# include <iostream>
# include <fstream> // do otwarcia pliku
# include <stdlib.h>
# include <cstring> // do operacji na stringach
# include <cmath>
using namespace std;
int main(){

    string napis;
    int linie = 0; //liczy linie w pliku txt , zeby wiedziec ile mamy danych
    double suma_ci = 0;
    double suma_ai = 0;
    double srednia_ci = 0;
    double srednia_ai = 0;
    double suma_x = 0;
    double suma_y = 0;
    float a = 0;
    float b = 0;

    fstream plik; // tworzymy uchwyt do pliku
    plik.open("regresja.txt", ios::in);
    if(plik.good()){
        cout <<"Dane z pliku:" <<endl;
        while(!plik.eof()){
            getline(plik,napis);
            std::string str = napis;
            if(str.length()>1){ // sprawdzxa czy w pliku txt linia ma wiecej niz jeden znak w innym przypadku nie robi nic

                std::string str2 = str.substr(0,3);
                std::string str3 = str.substr(4,1);
                double ci,ai;
ci=atof(str2.c_str()); // zamiana typu zmiennej z string na double , do obliczen
                ai=atof(str3.c_str()); // zamiana typu zmiennej z string na double . do obliczen
                cout << ci << "\t" << ai <<endl;
                linie++; //Liczymy linie
                suma_ci += ci; //sumujemy ci
                suma_ai += ai; //sumujemy ai
            }
        }
        srednia_ci = suma_ci / linie; // oblicza srednia
        srednia_ai = suma_ai / linie; // oblicza srednia
        plik.close();
    }

    plik.open("regresja.txt", ios::in);
    if(plik.good()){

        cout << "Tabela:" << endl;
        while(!plik.eof()){
            getline(plik,napis);
            std::string str = napis;
            if(str.length()>1){

                std::string str2 = str.substr(0,3);
                std::string str3 = str.substr(4,1);
                double ci,ai;
                ci=atof(str2.c_str());
ai=atof(str3.c_str());
                cout << ci << "\t" << ai << "\t" << ci - srednia_ci << "\t" << ai - srednia_ai << "\t" << pow(ci - srednia_ci,2.0) << "\t" << (ci - srednia_ci)*(ai - srednia_ai) <<endl;

                suma_x += pow(ci - srednia_ci,2.0); // sumuje wartsci przed ostatniej kolumny w kolejnym zadzialaniem petli
                suma_y += (ci - srednia_ci)*(ai - srednia_ai);// sumuje wartsci ostatniej kolumny w kolejnym zadzialaniem petli
            }
        }
        cout << endl;
        cout << srednia_ci; //Obliczamy srednia Ci
        cout << "\t";
        cout << srednia_ai; //Obliczamy srednia Ai
        cout << "\t\t\t";
        cout << suma_x;
        cout << "\t";
        cout << suma_y;
        cout << "\n\n";

        a = suma_y / suma_x;
        cout << "Wartosc a wynosi: " << a << endl;
        b = srednia_ai - (a * srednia_ci);
        cout << "Wartosc b wynosi: " << b << endl;
        cout << "y = " << a << "x + " << b <<endl;

        cout << "Prosze podac absorbancje:" << endl;
        int y;
        cin >> y;

        float x = (y/a) - b;
        cout << "Stezenie wynosi:" << x;
plik.close();
    }
  
    return(0);
}

(Frankfurterium) #2

Regulamin tego działu zabrania odrabiania czyichś lekcji przez wrzucanie gotowców. Zamiast "Zróbcie za mnie, bo ja nie umiem", popróbuj sam i pytaj o konkretne niepowodzenia. Problem nie należy do trudnych, więc na pewno znajdzie się ktoś, kto ci wtedy pomoże.


(kostek135) #3

Jak na moje to twojemu prowadzącemu chodzi o to, aby odczytwać dane z pliku mniej-więcej tak:

ifstream file("test.in");
double a, b;

while (!file.eof()) {
	file >> a >> b;
	cout << a << " " << b << endl; // w celu sprawdzenia czy wypisze to samo co wczyta (można usunąć)
}

To co robisz teraz, to pobierasz całą linię jako napis, a następnie dzielisz go na dwa (substring) i rzutujesz na double (atof), co jest trochę na około. Dodatkowo jeśli gdzieś w pliku np. pierwsza liczba nie będzie miała 3 znaków tylko inną ilość, to się to posypie.