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

C++ Wyszukiwanie/porównanie spacji w zmiennej.

Object Storage Arubacloud
0 głosów
1,362 wizyt
pytanie zadane 22 lutego 2018 w C i C++ przez Hadamalush Obywatel (1,880 p.)

Witam. Mój program wczytuje do zmiennej liczby z pliku tekstowego ,po czym ma z tej zmiennej wyciagnac wszystkie liczby oddzielone spacjami w tej zmiennej do tablicy. Jednakże jest błąd w 39 linijce ,tak jakby nie można porównać spacji do tej zmiennej ,tylko nie wiem dlaczego ,gdyż to jest string. W char tego nie zrobie ,bo ciąg znaków tej zmiennej jest ponad 200k. Proszę o pomoc i pozdrawiam serdecznie.

 

#include <iostream>
#include <fstream>
#include <cstdlib>

using namespace std;

int main()
{
    fstream plik;

    int * tablica = new int [64002];



    plik.open("dane.txt",ios::in);

    string linia; string allnumbers;


    while(getline(plik,linia))
    {
       allnumbers+=linia;
    }


    int dlugosc=allnumbers.size();

    string szukaj="0";
    int od=0;
    int dok=0;
    bool start=true;
    int d=0;



    for(int i=0;i>=dlugosc;i++)
    {

        if(allnumbers[i]==" " && start==true)
        {
            od=i;
            start=false;
        }
        if(allnumbers[i]==" " && start==false)
        {
            dok=i;
            start=true;
            tablica[d]=allnumbers.substr(od,dok);
            d++;
        }


    }



    return 0;
}

 

2 odpowiedzi

0 głosów
odpowiedź 22 lutego 2018 przez Knayder Nałogowiec (37,640 p.)
wybrane 22 lutego 2018 przez Hadamalush
 
Najlepsza
fstream file(...);
std::vector<int> numbers;
int temp;
while(!file.eof()) {
    file >> temp;
    number.push_back(temp);
}
file.close();

 

komentarz 22 lutego 2018 przez Hadamalush Obywatel (1,880 p.)
Nie rozumiem ,jak działa ten kod?
komentarz 22 lutego 2018 przez Knayder Nałogowiec (37,640 p.)
  • file to obiekt klasy fstream, to raczej ogarniasz.
  • numbers, to obiekt klasy std::vector<int> to raczej też ogarniasz xd
  • int temp to pomocnicza zmienna do wyciągania danych z pliku.
  • while(!file.eof()) rozbija się na: 
  1. while() pętla, raczej ogarniasz xd
  2. file.eof() funkcja klasy fstream. Zwraca true, jeżeli skończył się plik (eof - end of file).
  3. ! Neguje wartość.
  4. While wykonuje się tak długo, jak eof() zwraca false, czyli że plik jeszcze się nie skończył. Można to też zapisać tak:  while(file.eof() == false)
  • file >> temp; Z obiektu file, wrzuć do temp wszystko do jakiegoś znaku białego:
  • Reasumując, file >> temp, pobiera po kolei w odstępach jakie tworzą znaki białe. Tak działa >>.
  • W std::cin >> działa tak samo. Pobierze wszystko do znaku białego (spacja, enter itp) resztę zapisze w buforze

Przykład:
 

12 13 14 15 16

operator >> "widzi":
1 - zapisuję
2 - zapisuję
biały znak - o, czas wrzucić wszystko co dotychczas zapisałem do temp;
Następnie pętla while(!file.eof()) się powtarza i znowu dzieje się to samo, tylko że plik już jest przy 13.
1 - zapisuję
3 - zapisuję
o biały znak :)

komentarz 22 lutego 2018 przez monika90 Pasjonat (22,940 p.)
-1 za while (!file.eof()) i za fstream gdy wystarczy ifstream
komentarz 22 lutego 2018 przez Hadamalush Obywatel (1,880 p.)

@Knayder,
 Dziękuje za pomoc ,program smiga ,jak należy ,nie wiedziałem ,że tak mozna to rozkminić xd

Vectrów nigdy nie robiłem ,ale fajna sprawa widzę :)

A chodziło ogólnie ,żeby kod znajdował najwiekszą i najmniejszą liczbę z pliku. Dzięki jeszcze raz i pozdrówki :)

kod jakby ktos chcial zerknąć :

#include <iostream>
#include <fstream>
#include <vector>


using namespace std;

int main()
{
    fstream plik("dane.txt"); vector<int> number;
    int pomocna;


    while(!plik.eof()) {
    plik >> pomocna;
    number.push_back(pomocna);

    }
    int najmniejsza = number[0];
    int najwieksza = number[0];

    for(int i=1;i<=64000;i++)
    {
        if(najmniejsza>number[i])
        {
            najmniejsza=number[i];
        }
    }
    for(int i=1;i<=64000;i++)
    {
        if(najwieksza<number[i])
        {
            najwieksza=number[i];
        }
    }
    cout<<najmniejsza<<" "<<najwieksza;



   plik.close();


    return 0;
}

 

komentarz 22 lutego 2018 przez Knayder Nałogowiec (37,640 p.)

Monika, może dlatego że iteratory to może być coś czego nie zrozumie ktoś na takim poziomie...
A tym bardziej iteratory po strumieniu.
 

std::ifstream file("test.txt");
std::vector<int> numbers;
std::copy(std::istream_iterator<int>(file), std::istream_iterator<int>(), std::back_inserter(numbers));
file.close();

Zaufaj że sam nigdy bym nie zrobił tak jak to pokazałem wyżej...

komentarz 22 lutego 2018 przez monika90 Pasjonat (22,940 p.)
Nie chodzi o iteratory tylko o błędny warunek pętli, po wczytaniu ostatniej liczby eof niekoniecznie zwróci true.
komentarz 22 lutego 2018 przez Knayder Nałogowiec (37,640 p.)
Ja wiem że można się uczyć na czyichś błędach, ale jednak jakieś swoje trzeba zawsze popełnić.
komentarz 22 lutego 2018 przez mokrowski Mędrzec (155,460 p.)
Jeszcze klamry dodaj i będzie RAII :-)
+3 głosów
odpowiedź 22 lutego 2018 przez mokrowski Mędrzec (155,460 p.)
#include <iostream>
#include <vector>
#include <fstream>
#include <iterator>
#include <algorithm>

int main() {
	constexpr const char * fileName = "dane.txt";

	std::vector<int> numbers;
	{
		std::ifstream file(fileName);
		// TODO: Detect error open file
		using iIter = std::istream_iterator<int>;
		std::copy(iIter(file), iIter(), std::back_inserter(numbers));
	}
}

I po co męczyć się z jakimś zamykaniem pliku czy pętlą która może być "błędogenna"?

komentarz 22 lutego 2018 przez Hadamalush Obywatel (1,880 p.)
Nie rozumiem tego kodu po części. Problem został rozwiązany ,ale dzięki za chęć pomocy. Jak możesz to wyjaśnij co ten kod robi ,to zostanie w głowie drugi sposób przynajmniej :) Pozdrawiam.
1
komentarz 22 lutego 2018 przez mokrowski Mędrzec (155,460 p.)
Kod wyraża to co chcesz zrobić. A jeśli wyraża to najczęściej jest lepszym wyborem niż zapis w postaci liczników, zmiennych, testowania flag. Chcesz przecież zrobić kopię danych z pliku do vector'a :-)

Na otwartym pliku masz iterator czytający liczby typu int po kolei. Jeśli na iteratorrze zrobisz ++iterator (lub iterator++), to "przestawi" się on na następną liczbę z otwartego pliku. Wyłuskanie danych zrobisz przez *iterator. Tak się składa że wszystko to robi algorytm std::copy(...) który przyjmuje początek i koniec czytanych danych i początek danych gdzie należy skopiować.

W związku z tym że numbers jeszcze nie zawiera żadnych danych, trzeba je wstawiać z użyciem std::back_inserter.

Jeszcze pytanie dlaczego otwarta nowa klamra { i }. Tak się składa że niszczenie obiektu strumienia std::ifstream, zamyka automatycznie plik a jego konstruktor przyjmuje nazwę pliku który otwiera. Strumień jest typu std::ifstream bo dane chcesz wprowadzać (if od Input File).
komentarz 22 lutego 2018 przez Knayder Nałogowiec (37,640 p.)
Kolega pewnie jeszcze obiektówki nie przerabiał, a ty go wciągasz w takie bagno :P
komentarz 22 lutego 2018 przez mokrowski Mędrzec (155,460 p.)
IMHO "w bagnie" to się jest jak się koduje w trybie "lata 90'te" zeszłego wieku :-/ Oczywiście powody takiego stanu rzeczy są poza wpływem Twoim czy moim. W mojej ocenie nie oznacza to jednak że mam nie prezentować takiego podejścia a i Tobie nie bronię prezentować tego czego uważasz za adekwatne do umiejętności pytającego.

Wychodzę z założenia że jeśli pytający zobaczy, to będzie chciał doczytać/nauczyć się. Przecież ten kto chce szuka sposobu, ten kto nie chce szuka powodu..... :-)

Ja daję sposób. Jak zapytał, daję wytłumaczenie jakie umiem :-)
komentarz 22 lutego 2018 przez Knayder Nałogowiec (37,640 p.)
no rozumiem, jednak zawsze trzeba wziąć poprawkę na umiejętności osoby do której piszesz.
Nawet w szkołach tak robią, np. wzór na energię kinetyczną. W szkole na początku uczą że jest to Ek = (mv^2)/2, jednak jest to tylko zaokrąglenie i uproszczenie dużo trudniejszego wzoru :|
komentarz 22 lutego 2018 przez mokrowski Mędrzec (155,460 p.)
Twoja sprawa.... rób jak uważasz... Nic mi do tego :-)
1
komentarz 22 lutego 2018 przez Hadamalush Obywatel (1,880 p.)
Obietkówke robiłem ,ale dawno temu i trochę się zapomniało przez ten czas ,zajawka uciekła ,obietkówke ,że z Zelenta ,ale vectorów nie robiłem ,a tego tym bardziej. Ale dziękuje za pomoc wszystkim :)

Podobne pytania

0 głosów
1 odpowiedź 1,330 wizyt
pytanie zadane 4 maja 2018 w C i C++ przez Szymek_sw Początkujący (420 p.)
0 głosów
2 odpowiedzi 947 wizyt
pytanie zadane 9 stycznia 2018 w C i C++ przez mn130496 Gaduła (3,530 p.)
0 głosów
0 odpowiedzi 108 wizyt

92,555 zapytań

141,404 odpowiedzi

319,560 komentarzy

61,941 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

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!

...