Diskuze: C/C++ Dynamická alokace paměti.
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 7 zpráv z 7.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
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++.
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..
#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;
}
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.
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));
}
Zobrazeno 7 zpráv z 7.