[ Sephiroth? @ 17.04.2006. 12:18 ] @
Hitno mi treba mala pomoc, jednostavno kako bi u c++-u pretvorio neki string u niz tj
npr. string "primjer" u niz
niz [1]= p
niz [2]= r
niz [3]= i
niz [4]= m
niz [5]= j
niz [6]= e
niz [7]= r

Isto tako kako bi ucitao neki string iz file-a u program? u file-u neka bude znaci string a program da unosi karaktere jedan po jedan u neki niz...

Primjer koji sve ovo obuhvata a treba mi rjesenje je ustvari kako npr. iz filea prenijeti slijedecu matricu "n" redova i "m" kolona u neki dvodimenzionalni niz (npr. niz[n][m])?

primjer slicne matrice u file-u:

.+----+..
.|..k...|..
.|...v..|..
.+----+..

Eto to je konkretno znaci taj primjer. Znaci kako prenijeti ovu matricu u program?

Hvala unaprijed na pomoci!
[ leka @ 17.04.2006. 15:46 ] @
Odgovor: tako sto koristis neke osobine str::string tipa.

Kako najbolje pokazuje sledeci primer:
Code:

#include <iostream>

using namespace std;

int main(int argc, char**argv)
{
  string str = "Dobar dan";
  cout << str[2] << endl;
} // main() function

Na izlazu ces dobiti slovo "b", naravno.
[ NrmMyth @ 17.04.2006. 20:39 ] @
string je niz...
[ z@re @ 18.04.2006. 01:55 ] @
Kako rece Leka, string je niz...niz znakova (char). Zapravo u C++-u "string" je klasa unutar std namespacea, koja sluzi za lako baratanje s rijecima, recenicama...Ta klasa ima overloadiran operator polja, [], tako da se moze pristupati svakom podelementu stringa, koji je zapravo znak.

Znaci ako ti deklariras string temp = "bla bla";, ti tom stringu pristupas kao obicnom nizu, ako zelis doc do njegovih podznakova. temp[2] je znak 'a', itd...

Sad, sta se tice tvog drugog pitanja, ti zapravo trebas kreirat niz stringova, a u svakom clanu tog niza, je jedna linija tvoje .txt datoteke. Posto je svaki clan niza string koji sadrzi jednu liniju teksta, taj clan je opet niz. A clanovi tog niza su znakovi koji su sadrzani u toj liniji.

Tuzno je da bi se ovakav primjer jednostavnije rjesio iz C-a, jer C ipak ima mnogo razradjenije facilitye za dinamicku realokaciju memorije. Problem lezi u tome, sta ti neznas koliko tvoj txt file ima linija, dakle neznas na koliko ces inicijalizirat to polje stringova. Mozes nekako izbrojat, ali to je zaobilazenje problema. Uvijek mozes koristiti realloc() C-funkciju, medjutim to nije niposto dobro, mjesat C i C++ kod kad govorimo o alokaciji memorijskog prostora.

Najlaksi i najbolji nacin kojeg se mogu trenutno sjetit je da prvo sve te linije ubacis u jedan vector. Vectori su dio STL-a (ili STDC++-a), nesto poput vezanih lista. Vector je templatiziran, to znaci da ga jednom jednostavnom kljucnom rijeci mozemo natjerati da prima ulazne elemente tipa string.

Ovako bi to islo :

Code:

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

using namespace std;

int main()
{
    fstream testfile;
    vector<string> testvector; string temp;
    testfile.open("test.txt", ios::in );
    
    while(!testfile.eof()) 
    {
        getline(testfile, temp); 
        testvector.push_back(temp);
    }
    
    for(int i = 0; i < testvector.size(); i++)
    {
        for(int j = 0; j < testvector[i].size(); j++)
            cout << testvector[i][j];
        cout << endl;
    }
    
    system("PAUSE"); return EXIT_SUCCESS;    
}



Skroz jednostavan kod. Prvo smo deklalirali tri varijable. fstream klasa omogucuje I/O operacije nad datotekama, slicno kao FILE struktura u C-u. Jedan vektor, ciji su elementi stringovi, u kojeg cemo skladistit podatke, i jedan temporary string koji ce nam posluzit prilikom iscitavanja iz datoteke.

Dalje, pozivajuci metodu open otvaramo datoteku za iscitavanje. "open" metodi smo poslali dva argumenta - ime datoteke iz koje se iscitava, i jedan flag, ios::in, koji oznacava da cemo iz dane datoteke izvlacit podatke. To jest, otvaramo datoteku u "read" rezimu.

Nakon toga, ulazimo u while petlju za iscitavanje. while petlja se vrti sve dok nije doslo do kraja datoteke, sto nam pokazuje metoda eof iz fstream klase. Funkcijom getline iscitavamo jednu liniju teksta iz "testfile-a" u string temp, pa kasnije pozivajuci metodu push_back iz klase vector taj temp ubacujemo u vector. Tim nacinom svaku liniju teksta ubacujemo u temporary string, a taj string injectiramo u vector.

Na kraju, nas vector sadrzi kompletnu tekstualnu datoteku. "for" petlja nam sluzi da ispisemo taj sadrzaj, znak po znak, kako tebi i treba. Vanjska petlja nas vrti kroz linije, a unutranja kroz podznakove svake linije teksta. Vanjskoj petlji je krajnja vrijednost sama duzina vektora, dakle broj clanova u njemu, koju hvatamo sa size() metodom. Unutarnjoj petlji je krajnja vrijednost duzina trenutnog clana u vektoru, dakle stringa. Pazi da moramo notirati sa [] znakovima da hvatamo duzinu odredjenog clana. Nakon toga ispisujemo trenutni znak, koji se nalazi na iteraciji i, j. Jos, estetike radi, svaki put kad unutarnja petlja zavrsi iteriranje, ispisemo praznu liniju sa cout << endl;, kako i treba.