[C++] wczytanie z pliku ciągu liczb. wpisanie do wektora

z tym aspektem dopiero zaczynam, a jest mi potrzebne, bo nie mam ochoty wpisywać wielkich ciągów liczb z palca do programu, a uważam za wygodne je wczytać i dopiero później na nich operować, więc na początek chce się nauczyć, jak przenieść to co mam w pliku do wektora (wektor z uwagi na dowolną długość ciągu liczb)

kod programu

#include 

#include 

#include 


using namespace std;


int main ()

{

    cout<<"Wczytam dane z pliku i wpiszę je do tablicy, a na potwierdzenia wypiszę tablicę"

        "!będzie to tutaj jednak wektor!"<

    vectorwektor;


    fstream plik;

    plik.open("plik.txt", fstream::out); //otwieram plik i umożliwiam sobie z niego odczyt


    if(plik.is_open())

    {

        cout <<"\nPlik otwarto poprawnie"<
        }


    while(plik.good())

    {

        wektor.push_back((char) plik.get());

        }


    //wypisanie wektora

    while(!wektor.empty())

    {

        cout<
        wektor.pop_back();

        }

    return 0;

    }

powiedzmy, że w plik.txt mam ciąg liczb 1…10 i teraz co się dzieje przy komplikacji nie ma problemów, ale za każdym razem program zwraca -1, nie ważne co jest w pliku + tracę dane zapisane w pliku czemu tak się dzieje nie wiem, bo nie daję w tym kawałku

plik.open("plik.txt", fstream::out);

możliwości zapisywania w pliku , jakość poradników z google mnie nie zadowala, bo wszędzie jest co innego ifstream,fstream,itd nie wiem co do czego, ale skutecznie mi tą mąci w głowie… komendy brałem z http://www.cplusplus.com

jak zrobić, żeby było dobrze ?

plik.open(“plik.txt”, fstream::out); // otwierasz tylko do zapisu

wektor.push_back((char) plik.get()); // wczytujesz znak i dodajesz do wektora jego kod ASCII.

no to zrobię tak

wektor.push_back( (int) plik.get() );

i tak

plik.open("plik.txt", fstream:in);

ale z takim samym mizernym efektem, chyba, że nie tu leży błąd

choć jest kapkę lepiej, dostaję zupełnie inny ciąg liczb niż rzeczywiście, ale nie ma już zmian w pliku

wektor.push_back( (int) plik.get() ); // nadal wczytujesz znak i dodajesz do wektora jego kod ASCII.

no to jak dodać znak, a nie jego kod ?

Chcesz dodawać znaki czy liczby?

w tym przypadku potrzebne mi są konkretne liczby

    while(plik.good())

co robi kawałek

plik>>liczba

?

to samo co

cin>>liczba

dobra działa

#include 

#include 

#include 


using namespace std;


int main ()

{

    cout<<"Wczytam dane z pliku i wpiszę je do tablicy, a na potwierdzenia wypiszę tablicę"

        "!będzie to tutaj jednak wektor!"<

    vectorwektor;


    fstream plik;

    plik.open("plik.txt" , fstream::in); //otwieram plik i umożliwiam sobie z niego odczyt


    if(plik.is_open())

    {

        cout <<"\nPlik otwarto poprawnie"<
        }


    while(plik.good())

    {

        int liczba;

        plik>>liczba;

        wektor.push_back(liczba);

        }


    //wypisanie wektora

    cout<<"\nRozmiar wektora = "<

    while(!wektor.empty())

    {

        cout<
        wektor.pop_back();

        }


    return 0;

    }

ale chodzi dziwnie, nie do końca dobrze, bo wypisuje liczby

9 9 8 7 6 5 4 3 2 1

, w pliku liczby ułożone są następująco

1 2 3 4 5 6 7 8 9

czemu ostatnią liczbę wczytuje dwukrotnie ?

ponieważ stan plik.good() - nieprawda zachodzi dopiero po plik>>liczba; więc ostatnią dodajesz dwukrotnie.

while(true)
if(!(plik>>liczba)) break;

nie rozumiem, przyznam szczerze, tego kawałka… skoro plik>>liczba, robi to samo co cin>>liczba… to czemu to neguję ? wiem, chodzi dobrze, bo sprawdzałem, ale nie chciałbym wziąć tego na wiarę a zrozumieć :slight_smile:

wynikiem plik>>liczba jest sam plik

if(plik) jest tym samym co if(plik.good())

więc:

if(!(plik>>liczba)) break;

jest to samo co:

plik>>liczba;

if(plik.good()!=true) break;

ok, rozumiem…

a jak zrobić tak, żeby program faktycznie pobierał z pliku, gdzie jest ciąg liczb 12345 pojedyncze cyfry… bo dopiero jak między liczbami dałem spację, w wektorze miałem

1 | 2 | 3 | 4 | 5

jeśli spacji nie było,to do wektora było wczytywane

12345 | 12345

. Czym jest to spowodowane i jak można sobie z tym poradzić, żebym nie musiał się na następny raz martwić robieniem ręcznie spacji w pliku tekstowym.

Najpierw ustał co jest w pliku, liczby czy cyfry.

Owszem każda cyfra jest jednocześnie jednocyfrową liczbą ale liczba to nie cyfrą.

pierwotnie w pliku miała być 1000-cyfrowa liczba, ale właśnie do wektora wczytywały się dwie takie liczby i nie miałem jak operować na poszczególnych jej cyfrach, no to między każdą cyfrę dałem spację i mogłem prawidłowo, znaczy zgodnie z potrzebą wczytać sobie poszczególne cyfry…

z tego co napisałeś, wnioskuję, że

126 76 123

zostałoby wczytane do wektora

wektor-> 126 76 123

, ale już

12676123

zostanie wczytane do wektora jako

wektor->12676123

czyli nie da rady obejść tego tak, żebym ciąg 12676123 wczytał “pojedynczo po cyfrze” do wektora ?

A w wektorze chcesz mieć cyfry czy liczby?

do tego konkretnego przypadku cyfry

więc wczytywanie:

while(true)

{

char ch=plik.get();

if((‘0’>ch)||(ch>‘9’)) break; // lub if(!isdigit(ch)) break;

wektor.push_back(ch-‘0’);

}