Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Matthew
Člen
Avatar
Matthew:10.11.2013 18:13

Zdravím, dělám do školy semestrální projekt a v zadání mám, že tam musí být práce s dynamickou alokací paměti a s tou si právě nevím rady.. napadlo mě, že mám tam načítání dat ze souboru a načítám to do řetězce char radek[80], no, ale tam se může stát, že ten řádek bude delší než 80znaků což by mohl být problém, tak tam by se asi hodila ta alokace paměti. Vím, že by to mělo jít nějak že bych si tu paměť měl naalokovat pomocí funkce malloc a případně rozšířit paměť pomocí funkce realloc, zkoušel jsem toho dost, ale prostě mi to pořád nejde, můžete mi prosím někdo poradit, díky :)

 
Odpovědět
10.11.2013 18:13
Avatar
vitamin
Člen
Avatar
vitamin:10.11.2013 18:44

Najprv si ujasni ci to chces robit v C alebo C++(v C++ je to ovela jednoduhsie).

 
Nahoru Odpovědět
10.11.2013 18:44
Avatar
Odpovídá na Matthew
Zdeněk Pavlátka:10.11.2013 19:03

Na alokaci paměti v C a C++ jsou tu pěkné články, stačí se jen podívat mezi tutoriály na C/C++.

Nahoru Odpovědět
10.11.2013 19:03
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Matthew
Člen
Avatar
Matthew:10.11.2013 19:24

No jestli v C nebo v C++ je mi celkem jedno.. Pročetl jsem ti toho fakt hodně, ale zatím se mi to nepovedlo.. zkoušel jsem to v C a vím asi jen že bych pomocí funkce malloc si naalokovat tu paměť a pak pokud ten řádek bude příliš dlouhý tak pomocí realloc přealokovat tu paměť tedy ji rozšířit pokud to říkám správně, ale nepovedlo se mi to dát nějak funkčně dokupy..

 
Nahoru Odpovědět
10.11.2013 19:24
Avatar
vitamin
Člen
Avatar
Odpovídá na Matthew
vitamin:10.11.2013 20:12
#include <fstream>
#include <iostream>
#include <string>
#include <vector>

int main(){
        using namespace std;

        fstream file("file.txt");
        vector<string> lines;           //vektor a string sa posara o dynamicku alokaciu pamete
        string str;

        while(file.good()){                     //cyklus prebieha dokym je vstupny subor v poriadku (nenastala ziadna chyba a pozicia v streame nenarazila na koniec)
                getline(file, str);             //nacita ridok z file do str
                if(str.size())lines.push_back(move(str));       //ak nie je riadok prazdny tak ho vlozi do vektora lines
        }

        //vypis riadkov:
        for(auto& i : lines)
                cout << ">" << i << "\n";

        return 0;
}
 
Nahoru Odpovědět
10.11.2013 20:12
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Matthew
Lukáš Hruda:10.11.2013 21:26

Pokud to děláš v C++ tak se na nějakou ruční dynamickou alokaci můžeš vykašlat a použít vector, také můžeš místo pole znaků použít string (viz vitaminův příspěvek). Pokud máte přímo v zadání že musíte alokovat ručně, pak asi budeš muset nejdříve zjistit délku toho textu (počet řádků / počet znaků) a podle toho teprve alokovat pole.

 
Nahoru Odpovědět
10.11.2013 21:26
Avatar
Panda38
Tvůrce
Avatar
Odpovídá na Matthew
Panda38:11.11.2013 7:53

Jednou z možností práce se soubory je načíst celý soubor do paměti - zjistí se velikost souboru, naalokuje se buffer pro celý soubor a soubor se do něj načte. Je-li to textový soubor, může se při zpracování obsahu použít jako koncová zarážka nulový znak. Tento způsob je vhodný pro soubory s předpokládanou velikostí do několika desítek MB, u větších by už mohl být problém s pamětí a dobou načítání. Např. (ReadInputFile načte zadaný soubor do bufferu InBuff a na konec dá jako zarážku znak "0", při chybě vrátí "false" ... + příklad pár funkcí pro zpracování obsahu):

char* InBuff = NULL;    // input buffer
int InBuffNum = 0;      // size of input buffer
int InBuffOff = 0;      // read offset in input buffer

// read input file, returns false on error
bool ReadInputFile(const char* filename)
{
        // open input file
        FILE* f = fopen(filename, "rb");
        if (f == NULL) return false;

        // get file size of input file
        fseek(f, 0, SEEK_END);
        InBuffNum = ftell(f);
        fseek(f, 0, SEEK_SET);

        // allocate buffer
        free(InBuff);
        InBuff = (u8*)malloc(InBuffNum+1);
        if (InBuff == NULL)
        {
                fclose(f);
                return false;
        }

        // read input file
        int num = fread(InBuff, 1, InBuffNum, f);

        // close input file
        fclose(f);

        // check result
        if (num != InBuffNum) return false;

        // set stop mark
        InBuff[InBuffNum] = 0;
        InBuffOff = 0;

        return true;
}

// test next input character (returns 0 on end of file)
char TestCh()
{
        return InBuff[InBuffOff];
}

// load one input character (returns 0 on end of file)
char GetCh()
{
        char ch = TestCh();
        if (ch != 0) InBuffOff++;
        return ch;
}

// skip spaces, tabulators and CR
void SkipSpc()
{
        char ch;
        int oldoff;
        for (;;)
        {
                oldoff = InBuffOff;
                ch = GetCh();
                if ((ch != ' ') && (ch != 9) && (ch != 13))
                {
                        InBuffOff = oldoff;
                        break;
                }
        }
}

// go to next line
void NextLine()
{
        char ch;
        do ch = GetCh(); while ((ch != 10) && (ch != 0));
}
 
Nahoru Odpovědět
11.11.2013 7:53
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.