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.