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

question-closed c++ zadanie z klasą i szybkie pytanie

Object Storage Arubacloud
0 głosów
533 wizyt
pytanie zadane 12 lutego 2017 w Rozwój zawodowy, nauka, praca przez Barteck125 Obywatel (1,120 p.)
zamknięte 13 lutego 2017 przez Barteck125

Witam wszystkich bardzo serdecznie :). Mam taki problem otóż: robię zadanie w c++. Mam do zrobienia klase Tablica, która posiada argumenty : wiersze, kolumny i char**tab (dwuwymiarowa tablica dynamiczna) . Konstruktor klasy alokuje pamięc dla tab.   Oprócz konstruktora mam metodę: void readTablica(const char* nazwaPliku). Ta metoda odczytuje moją tablicę z pliku i zapisuje ją do tablicy. Wnioskuję, że mam skorzystać z mojego konstruktora gdzie mam moją dynamiczną talicę dwuwymiarową ale nie wiem jak sie do tego odwołać. Dorzucam kod mojej metody. Macie jakiś pomysł jak zapisać te znaki z pliku do tej tablicy ? Dziękuje za odp.

void Tablica::readTablica(const char* nazwaPliku){
	fstream plik;
	plik.open(nazwaPliku, ios::in);
	if(plik.good()==true){
	cout<<"it's okey";
	char a[30];
	plik.get(a,30);

	}
	else {cout<< " upsss";}
}

 

komentarz zamknięcia: uzyskałem potrzebne info
komentarz 12 lutego 2017 przez Dexterim Dyskutant (8,370 p.)
a czy w pliku sa informacje o wielkosci macierzy?
komentarz 12 lutego 2017 przez Barteck125 Obywatel (1,120 p.)
Tworze sobie w konstruktorze( int wiersze, int kolumny){......}

i pózniej przy tworzeniu obiektu w main podaje dowolny wymiar.

np Tablica a(10,2)

3 odpowiedzi

+1 głos
odpowiedź 12 lutego 2017 przez mokrowski Mędrzec (155,460 p.)
wybrane 13 lutego 2017 przez Barteck125
 
Najlepsza

Wiesz, ja nie widzę całej Twojej klasy więc ... sam sobie dopisałem resztę :-) 

Można np. tak

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

using namespace std;

class Tablica {
public:
    Tablica(size_t wiersze, size_t kolumny): kolumny(kolumny), wiersze(wiersze) {
        dane = new int*[wiersze];
        for(size_t i = 0; i < wiersze; ++i) {
            dane[i] = new int[kolumny];
        }
    }
    void czytajPlik(const char * nazwaPliku) {
        ifstream plik(nazwaPliku);
        if(not plik) {
            cerr << "Problem z otwarciem pliku " << nazwaPliku << ".\n";
            exit(EXIT_FAILURE);
        }
        for(size_t i = 0; i < wiersze; ++i) {
            string linia;
            plik >> linia;
            for(size_t j = 0; j < kolumny; ++j) {
                dane[i][j] = linia[j];
            }
        }
    }
    void pokazTablice() const {
        for(size_t i = 0; i < wiersze; ++i) {
            cout << "Wiersz: " << i << "| ";
            for(size_t j = 0; j < kolumny; ++j) {
                cout << dane[i][j] << ' ';
            }
            putchar('\n');
        }
    }

private:
    int **dane;
    size_t kolumny;
    size_t wiersze;
};

int main() {
    Tablica t(6, 10);
    t.czytajPlik("data.txt");
    t.pokazTablice();
}

A dane mam np. takie:

1234567890 3231231412 4454545452 1231343435 zzxassdasa ffqwqdzczA

 

komentarz 12 lutego 2017 przez draghan VIP (106,230 p.)
Dwie uwagi co do kodu:

1) Nie zwalniasz pamięci po jej zaalokowaniu (wypadałoby to zrobić, np. w destruktorze).

2) W C++ nie należy używać funkcji exit - jest ona przeznaczona dla programów w C, nie pozwala na wywołanie destruktorów przed zakończeniem pracy programu.
komentarz 12 lutego 2017 przez mokrowski Mędrzec (155,460 p.)
Dzięki za uwagi. Zakładałem że pytający (jak napisał) miał klasę więc to jest kod "po najmniejszej linii oporu". http://en.cppreference.com/w/cpp/utility/program/exit

Oczywiście, powinien być destruktor pracowicie usuwający tak tablice z kolumnami jak i samo miejsce na wiersze, ustosunkowanie się do kopii, przypisania, move..... ale pytającego interesował sposób implementacji czytajPlik() :-)
komentarz 12 lutego 2017 przez draghan VIP (106,230 p.)

Nie pisałem o tym, co mogłoby tu jeszcze być, tylko o tym, co musi być z punktu widzenia poprawności tego prostego programu.

(jeśli linkujesz dokumentację po to, żeby pokazać że exit() wywołuje destruktory, to sugeruję przeczytać dokładnie całość linkowanej strony)

I nie zrozum tego jako jakiegoś ataku na siebie (akurat tak się przypadkiem złożyło, że wczoraj również zgłaszałem pewne obiekcje do Twojej wypowiedzi) - zależy mi na tym, żeby niedoświadczonym programistom pokazywać poprawny kod - tylko tyle. :)

komentarz 13 lutego 2017 przez Barteck125 Obywatel (1,120 p.)
Mam jeszcze takie pytanie na koniec :): Powiedzmy ze mam w pliku zapisane same znaki 'x' i 'o' kod jest np: xxxoxooxxxoxxxxx xooxooxxxoxoooxx .... i chciałbym przeciążyć operator <<(wyjscia) tak aby wyświetlał same 'x' a tak gdzie jest 'o' to luki. I tu jest moje pytanie czy mogę w ciele tego przeciążenia zrobić jakby jeszcze raz otwarcie z pliku i wypisywanie tego tylko w "szczególny" sposób ?  Dzięki za odp
komentarz 13 lutego 2017 przez draghan VIP (106,230 p.)

I tu jest moje pytanie czy mogę w ciele tego przeciążenia zrobić jakby jeszcze raz otwarcie z pliku i wypisywanie tego tylko w "szczególny" sposób ?

Operacje na plikach są operacjami stosunkowo wolnymi. Skoro już masz wczytaną zawartość do pamięci, to nie ma sensu ponownie otwierać strumień do pliku. Skorzystaj z tablic, które przechowują jego zawartość w RAM.

komentarz 13 lutego 2017 przez Barteck125 Obywatel (1,120 p.)
Tylko że przez przeciążenie chcę wyświetlić dość zmodyfikowaną tą tablice, więc miałem pomysł, aby to zrobić za pomocą pętli i pobierania charów z pliku. Tak zrobiłem i to działa tylko, że jedyny minus jest taki, że otwieram plik jeszcze raz. Rozumiem że dzięki mojemu konstruktorowi już mam tą tablice z pliku w RAM komputera, jednak nie potrafię wprowadzić żadnych modyfikacji w ten sposób. Nawet nie wiem czy jest to możliwe. Dzięki za odpowiedz:)
komentarz 13 lutego 2017 przez draghan VIP (106,230 p.)

Wyświetlenie tablicy to jedynie prosta pętla. Ominięcie wyświetlania pewnych znaków i wstawienie zamiast nich białych znaków to tylko jeden warunek.

// na przykład (przyjąłem nazewnictwo jak w klasie Użytkownika  mokrowski):

void Tablica::pokaz() const
{
    for (size_t i = 0; i < wiersze; ++i)
    {
        for (size_t j = 0; j < kolumny; ++j)
        {
            if(dane[i][j] == 'o')
            {
                std::cout<<' ';
            }
            else
            {
                std::cout<<dane[i][j];
            }
        }
        std::cout<<'\n';
    }
}

 

komentarz 13 lutego 2017 przez Barteck125 Obywatel (1,120 p.)
Faktycznie :) świetnie rozwiązanie. Dzięki mega mi pomogłeś, kawał dobrej roboty.Pozdrawiam. Temat do zamknięcia.
komentarz 13 lutego 2017 przez draghan VIP (106,230 p.)
Na zdrowie. :)
+1 głos
odpowiedź 12 lutego 2017 przez Dexterim Dyskutant (8,370 p.)
Myślę że najłatwiej będzie to zrobić w dwóch pętlach korzystając z funkcji std::stoi (bądź stod w zaleznosci od typu)

Przyda się też zmienna tymczasowa string.
komentarz 12 lutego 2017 przez Barteck125 Obywatel (1,120 p.)
własnie mam taki pomysł ze w tej metodzie tworze dwie pętle i na koncu daje:

plik>>tab[i][j]; // i teoretycznie działa choc nie wiem czy to jest do końca okej :D

Dzięki za odp :)
komentarz 12 lutego 2017 przez Dexterim Dyskutant (8,370 p.)
możliwe że działa ale masz tutaj niejawno konwersje ze stringa do int/double
komentarz 12 lutego 2017 przez Barteck125 Obywatel (1,120 p.)
ale ja w moim pliku który wczytuje mam tylko chary typu 'x' albo 'o', wiec chyba będzie ok ?
komentarz 12 lutego 2017 przez Dexterim Dyskutant (8,370 p.)
tak to w porządku ;)
0 głosów
odpowiedź 12 lutego 2017 przez mokrowski Mędrzec (155,460 p.)
Jeszcze tylko odpowiedz na pytania:

1. Rozumiem że jesteś zobowiązany aby trzymać macierz w tablicy ** ? (Tak/Nie)

Jeśli nie, to z niej zrezygnuj na rzecz vector.

2. W pliku z którego czytasz zawartość macierzy, jest podany jawnie jej rozmiar (np. 2 wpisy typu ilość_kolumn ilość_wierszy)? (Tak/Nie)

Jeśli tak sprawa bardzo się uprości.

3. Plik z zawartością ma jakąś strukturę (np. pola oddzielone spacją) czy jest "strumieniem danych binarnych" ? (Tak/Nie)
komentarz 12 lutego 2017 przez Barteck125 Obywatel (1,120 p.)
1. TAK

2.NIE

3. NIE jest to bezsensowny ciąg charów ze spacjami np: xxxooxooxo xooxoxoxxx ooxoxxooxo      ( wiersze tej samej wielkosci, wszystko w jednej linii, około 6 takich ).

Podobne pytania

0 głosów
2 odpowiedzi 295 wizyt
pytanie zadane 27 października 2017 w C i C++ przez Kurczak Użytkownik (940 p.)
0 głosów
2 odpowiedzi 808 wizyt
pytanie zadane 3 grudnia 2016 w C i C++ przez niezalogowany
0 głosów
1 odpowiedź 81 wizyt
pytanie zadane 9 czerwca 2016 w C i C++ przez alchem Obywatel (1,210 p.)

92,551 zapytań

141,400 odpowiedzi

319,531 komentarzy

61,938 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!

...