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

Zapis wypisywanych danych do pliku text.exe

Object Storage Arubacloud
0 głosów
281 wizyt
pytanie zadane 10 listopada 2015 w C i C++ przez Evelek Nałogowiec (28,960 p.)

Czy jest możliwość aby wyniki z konsoli w trakcie zliczania wypisały się do pliku .txt? Kod programu wygląda tak, jest to zwykłe liczenie w górę o określoną ilośc podaną przez a:

#include <iostream>
#include <cstdlib>
#include <stdio.h>
#include <iomanip>
int main()
{
    using namespace std;
    cout << "Podaj liczbe calkowita: ";
    long double a;
    cin >> a;
    cout << "Zliczanie co " << a << endl;
    cout <<setprecision(10000);
    for ( long double i = 0; i<10000; i = i + a)
            cout << i << endl;

    getchar();
    getchar();
}

Próbowałem już w to wpisywać pętle while oraz for ale bezskutecznie, zawsze był błąd przy kompilacji pliku.

2 odpowiedzi

+1 głos
odpowiedź 10 listopada 2015 przez furas Maniak (53,800 p.)
wybrane 30 marca 2017 przez Evelek
 
Najlepsza

Zawsze podawaj treść błędu bo nikt nie jest jasnowidzem.

---

Jeśli chcesz robić to w kodzie to musisz otworzyć plik do zapisu, zapisywać w nim dane a potem go zamknąć.

 

Można też wykorzystać system operacyjny do zapisu do pliku uruchamiając program w konsoli 

moj_program.exe > wyniki.txt

Wtedy wszystko co normalnie idzie na ekran (w tym komunikat "Podaj ...") zostanie zapisane w pliku.

0 głosów
odpowiedź 10 listopada 2015 przez Evelek Nałogowiec (28,960 p.)

Niepotrzebnie chyba temat zakładany, ale może komuś się przyda. Kod teraz wygląda tak:

#include <iostream>
#include <cstdlib>
#include <stdio.h>
#include <iomanip>
#include <fstream>
int main()
{
    using namespace std;

    fstream plik;
    plik.open("wyniki.txt", ios::out | ios::app);

    cout << "Podaj liczbe calkowita: ";
    long double a;
    cin >> a;
    cout << "Zliczanie co " << a << endl;
    cout <<setprecision(1000);
    for ( long double i = 0; i<1000; i = i + a)
    {
            cout << i << endl;
            plik << i << endl;
    }

    plik.close();

    getchar();
    getchar();
}

Wcześniej nie działał bo linijka ' plik << i << endl; ' była poza klamrą, jedna zmiana i wszystko działa.

 

Teraz inne pytanie do tematu. Po wypisaniu do pliku .txt wartości są w porządku do liczby 999999. Dalej zapisuje się jako 1.00011e+006 itd. Można to zmienić aby liczby w pliku .txt były identyczne jak w konsoli bez zapisu naukowego?

komentarz 10 listopada 2015 przez furas Maniak (53,800 p.)

A może używaj lczb całkowitych int zamiast rzeczywistych double.

A czy    plik << setprecision(1000);     nie działa ?
Jeśli nie działa to zostaje najpierw zamienić liczbę na tekst
a potem dopiero zapisywać tekst do pliku.

 

komentarz 10 listopada 2015 przez Evelek Nałogowiec (28,960 p.)

Typ int już zapisuje wszystko, czyli typ double powodował zapis naukowy.

Ale jeszcze taka mała niezgodność, typ long long int powinien wypisywać liczby do 19 223 372 036 854 775 807 a mi wypisuje do 2 147 483 647 tak jakby kompilował dla typu long int. Jakiś błąd w kompilacij czy tak być powinno?

I jaki jest typ zmiennej dla największej liczby możliwej do zapisania? Czy jest to typ long double który może zapisać kilkadziesiąt cyfr w liczbie czy istnieją dłuższe? I czy one poprawnie zapisują liczby do pliku tekstowego bez użycia notacji naukowej? I czy nie jest tak, że gdyby program nie musiał liczb wypisywać pokolei w konsoli a musiał zamiast tego wypisać jedną liczbę to mogłaby ona być większa od tych, które byłyby wypisywane w konsoli?

komentarz 10 listopada 2015 przez furas Maniak (53,800 p.)

C/C++ nie określa jakiej wielkości jest int i inne typy całkowite - może to zależeć od kompilatora i systemu operacyjnego. 

---

Według poniższego linku największe wartości przechowuje unsigned long long

http://stackoverflow.com/questions/589575/what-does-the-c-standard-state-the-size-of-int-long-type-to-be

---

Nawet jakbyś chciał wypisywać jedną liczbę to nie dasz rady wypisać większej.

Musiał byś stworzyć własny typ danych - np. zbudowany z dwóch liczb unsigned long long i dorobić do niej działania matematyczne oraz funkcje zamiany na tekst aby otrzymać coś większego.  Możesz też trzymać każdą cyfrę w osobnej zmiennej (osobna zmienna na ilość jednostek, osobna na ilość dziesiątek, osobna na ilość setek) i dorobić do tego działania matematyczne oraz wypisywanie (zamianę na tekst).

Powinny być biblioteki do obsługi dużo większych liczb - często mówi się o takich liczbach Big Integer.

---

double przechowuje liczby rzeczywiste w pewnym przybliżeniu - więc i wartości całkowite może przechowywać w pewnym przybliżeniu.

komentarz 10 listopada 2015 przez Evelek Nałogowiec (28,960 p.)

W programie z kursu do wypisania n-tej liczby ciągu Fibonacciego, jeśli dam wartość nawet te 20000 to pojawi się ogromna liczba. Ale jakim cudem ona się pojawiła tam, skoro typ long double nie powinien przechowywać tak dużej liczby? Kod programu:

#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <time.h>
#include <stdio.h>
#include <windows.h>

using namespace std;

long double fib[100000];
int n;

int main()
{
    cout << "Ile liczb Fibonacciego mam wyznaczyc: " << endl;
    cin >> n;

    fib[0] = 1;
    fib[1] = 1;

    for (int i = 2; i<n; i++)
    {
        fib[i] = fib[i-1] + fib[i-2];
    }

    cout <<setprecision(10000);

   cout << endl << "Wyraz nr " << n << "\n" << fib[n-1];

return 0;
}

 

komentarz 10 listopada 2015 przez furas Maniak (53,800 p.)
A jak dużą liczbę otrzymałeś i jak dużą liczbę potrafi przechować long double ?
komentarz 10 listopada 2015 przez Evelek Nałogowiec (28,960 p.)

Z ciągu Fibonacciego w tym pliku po wpisaniu do konsoli 20000 otrzymałem liczbę na dobre 300 cyferek, więc jednak trochę long double przechowuje. Jest on 12 bitowy. Wychodzi na to, że mieści około 30 cyferek. Stworzyłem program który pokazuje ile jaki typ ma bajtów i jego wartość maksymalną.

#include <iostream>
#include <climits>

int main()
{
    using namespace std;
    int n_int = INT_MAX;
    long n_long = LONG_MAX;
    long long n_llong = LLONG_MAX;
    unsigned int n_uint = UINT_MAX;
    unsigned long n_ulong = ULONG_MAX;
    unsigned long long n_ullong = ULLONG_MAX;

    cout << "int ma: " << sizeof (int) << " bajty." << endl;
    cout << "long ma: " << sizeof (long) << " bajty." << endl;
    cout << "long long ma: " << sizeof (long long) << " bajty." << endl;
    cout << "unsigned int ma: " << sizeof (unsigned long) << " bajty." << endl;
    cout << "unsigned long ma: " << sizeof (unsigned long) << " bajty." << endl;
    cout << "unsigned long long ma: " << sizeof (unsigned long long) << " bajty." << endl;

    cout << "dlugosc int: " << n_int << endl;
    cout << "dlugosc long: " << n_long << endl;
    cout << "dlugosc long long: " << n_llong << endl;
    cout << "dlugosc unsigned int: " << n_uint << endl;
    cout << "dlugosc unsigned long: " << n_ulong << endl;
    cout << "dlugosc unsigned long long: " << n_ullong << endl;


    return 0;

}

Nadal nie rozumiem, na początku programu z liczbami Fibonacciego ustawiamy typ zmiennej fib jako long double. Powinna ona wypisać liczbę o długości maksymalnie około 30 cyfer, a ona wypisuje blisko ponad 300.

komentarz 10 listopada 2015 przez furas Maniak (53,800 p.)

W swoim przykładzie wypisujesz tylko typy całkowite int a double jest typem rzeczywistym.

Mnie wyszło, że long double ma 12 bajtów a nie bitów.
 

long double ma: 12 bajty.
dlugosc long double: 1.18973e+4932


http://ideone.com/nWl4eH

http://en.cppreference.com/w/c/types/limits

komentarz 10 listopada 2015 przez Evelek Nałogowiec (28,960 p.)

Właśnie nie mogłem znaleźć poprawnego zapisu do programu dla long double.'

Tak, miałem na myśli 12 bajtów a nie bitów, pomyłka.

Dziękuje ślicznie za pomoc.

Więc long double przechowuje tak duże liczby. A wcześniej napisałeś, że "Według poniższego linku największe wartości przechowuje unsigned long long". A tu się okazuje, że jednak największe przechowuje long double?

I myślę to już ostatnie pytanie co do tematu: "Dlaczego skoro typ long double przechowuje tak duże liczby to program w pewnym momencie wykonywania, poddaje się i przestaje je wyliczać? Czym to jest spowodowane? Jest możliwość zmuszenia program aby wypisywał te liczby?

Przecież tak jak są rekordy w ilości cyfr po przecinku liczby pi w setkach tysięcy, tak jakoś programy komputerowe musiały te liczby wyznaczać, a nie kończyły się na kilkuset cyfrach po przecinku.

komentarz 10 listopada 2015 przez furas Maniak (53,800 p.)

unsigned long long przechowuje największe wartości całkowite a double przechowuje wartości rzeczywiste stosując zaokrąglenia więc jeśli chcemy operować tylko na wartościach całkowitych to wybiera się jednak unsigned long long jako dające dokładne wyniki.

Może być tak, że long double stosuje jakieś dodatkowe operacje aby wyniki były dokładniejsze ale mimo wszystko trzeba być przygotowanym, że w pewnych warunkach zaokrąglenia mogą się skumulować i dać niepoprawny wynik.

Nie wiem jak duże liczby powstają - może po prostu rosną tak szybko, że i tego long double nie starcza :)

Podobne pytania

0 głosów
1 odpowiedź 1,941 wizyt
pytanie zadane 23 listopada 2018 w Java przez mn130496 Gaduła (3,530 p.)
0 głosów
2 odpowiedzi 1,509 wizyt
pytanie zadane 14 maja 2016 w C i C++ przez Evelek Nałogowiec (28,960 p.)
0 głosów
2 odpowiedzi 593 wizyt
pytanie zadane 28 lipca 2016 w PHP przez rucin96 Użytkownik (500 p.)

92,762 zapytań

141,686 odpowiedzi

320,499 komentarzy

62,106 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

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!

...