Cititul unui fisier

Intrebari despre limbajul C++, standardul C++, STL, OOP in C++ sau alte subiecte nelegate de VisualC++

Cititul unui fisier

Mesajde Sjack » 03 Feb 2010, 00:26

Inainte de toate, da, am citit aici, dar n-am inteles mai nimic, mai ales de ce e codul ala din paranteza while si de ce ce nu s-a folosit include namespace std;( e ceva optional, dar de ce sa scrii in plus std:: la fiecare comanda din namespaceul std?)

Vreau sa fac ceva experimente si am neaparat nevoie de un fisier text pentru a adauga cuvinte unui array char.
De exemplu am
Cod: Selectaţi tot
char *vocabular[s]={"mama","tata","este","pere","mere"}; //etc.., aici 's' e 5

(nu nu vreau sa fac un translator sau ceva de genu :lol: )

Cum pot sa am am chestia asta stocata in exterior? Pe un fisier? Ca aici ma poticnesc, ca doar nu e cod compilat. Ma gandesc ca in fisierul ala trebuie sa specific lungimea array-ului(variabila s) si o modalitate de a adauga cuvinte in array. Deci practic array-ul e declarat in program, dar initializat in fisier.(in program nu ar avea nici un element sau ceva de genu).
Trebuie sa intelegeti ca sunt incepator si daca imi oferiti niste exemple as vrea sa fie cat mai simple posibil.
Va multumesc anticipat.
Ultima oară modificat de Sjack pe 03 Feb 2010, 12:52, modificat 1 dată în total.
Avatar utilizator
Sjack
Junior
Junior
 
Mesaje: 4
Membru din: 02 Feb 2010, 01:27

Re: Cititul unui fisier

Mesajde zlatomir » 03 Feb 2010, 03:14

Pentru a intelege acel exemplu postat de Ovidiu ai nevoie sa intelegi std::vector si std::string, practic vectorul e o clasa din STL care defineste un fel de "array" dar care isi stie marimea, se pot adauga elemente fara sa se foloseasca alocare dinamica a memoriei, etc, mai multe aici: http://www.cplusplus.com/reference/stl/vector/
String-urile aici: http://www.codexpert.ro/articole.php?id=4 , mi se pare ca avea Marius si un articol despre std::vector, dar nu il gasesc acum...

Sau te incurca faptul ca Ovidiu a scris o functie? Daca da atunci ai aici un exemplu care nu foloseste o functie ci doar ia dintr-un fisier si afiseaza in consola:
Cod: Selectaţi tot
#include <iostream>
#include <fstream>
#include <vector>
#include <string>

using namespace std;

int main() {
   string str;         /* se creaza un obiect de tip string care va fi folosit initial pentru a stoca numele fisierului */

   vector<string> vec;         /* se creaza un vector care contine string-uri */
   cout << "Introduceti numele fisierului: ";
   cin >> str;          /* se citeste numele fisierului din care se citesc datele */

   ifstream f(str.c_str());  /* se creaza un ifstream numit f, ifstream, acel i vine de la input, iar c_str converteste din string in c-style string adica pointer la caracter (e nevoie de acest format pentru numele fisierelor */

   if(!f){        //se verifica daca fisierul a fost deschis

      cout << "Nu se poate deschide fisierul " << str << endl;
        system("pause");            // pentru mentine consola vizibila, functioneaza doar pe windows
      return -1;
   }

   while(!f.eof()) {         //se citeste din fisier
      getline(f, str);           /*getline ia doi parametrii un stream din care sa citeasca pana cand ajunge la o linie noua, si o variabila string in care va pune ce a citit*/
      vec.push_back(str);       /*std::vector are functii membre, care pot adauga elemente, push_back e una dintre ele, practic adauga fiecare linie din fisier ca un nou element al vector-ului */
   }

   for(vector<string>::iterator i = vec.begin(); i != vec.end(); i++) // se printeaza in consola continutul vectorului
      cout << *i << endl;
// sau asa
    /*for(unsigned int i = 0; i < vec.size(); i++)  // cod mai usor de inteles pt printarea vectorului
        cout << vec[i] << endl;
    */ 
   system("pause");
   return 0;
}
Ultima oară modificat de zlatomir pe 03 Feb 2010, 16:17, modificat 1 dată în total.
Avatar utilizator
zlatomir
Membru
Membru
 
Mesaje: 175
Membru din: 04 Iul 2009, 23:59
Localitate: Arad->Felnac

Re: Cititul unui fisier

Mesajde Marius Bancila » 03 Feb 2010, 09:52

Sjack scrie:dar n-am inteles mai nimic, mai ales de ce e codul ala din paranteza while

Cod: Selectaţi tot
        std::string line;
        while(std::getline(file, line)) // get the line
        {
            v.push_back(line);          // put line in the vector
        }

Codul din paranteza while citeste linie cu linie din fisierul file. Cand ajunge la sfarsit si nu mai citeste nimic, blocul while nu se mai executa.
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog
Avatar utilizator
Marius Bancila
Fondator
Fondator
 
Mesaje: 1777
Membru din: 11 Iul 2007, 11:45
Localitate: Timisoara

Re: Cititul unui fisier

Mesajde Dragos Cojocari » 03 Feb 2010, 09:59

Sjack scrie:Inainte de toate, da, am citit aici, dar n-am inteles mai nimic, mai ales de ce e codul ala din paranteza while si de ce ce nu s-a folosit include namespace std;( e ce va optional, dar de ce sa scrii in plus std:: la fiecare comanda din namespaceul std?)

std:: ( numele namespace-ului) trebuie folosit doar ca sa califici nume de definitii din acel namespace. Adica, daca vreau sa folosesc un tip definit in namespace, precum ifstream, atunci trebuie sa il folosec. La fel daca as vrea sa folosesc functii de acolo, cum ar fi get_line. E incorect insa sa folosesti std:: ptr a califica orice altceva.

Exemplu:

Cod: Selectaţi tot
std::ifstream file; // corect -calificarea cu std:: e necesara deoarece  ifstream e un tip definit in std

file.open(); // corect
std::f.open(); // incorect - calificarea cu std:: nu e necesara deoarece f nu e definit in namesapce-ul std

std::get_line(); // corect - calificarea cu std:: e necesara deoarece functia get_line e definita in namespace-ul std



Zlatomir scrie:
Cod: Selectaţi tot
cout << "Introduce-ti numele fisierului: ";


Chiar daca e C++ hai sa scriem corect si in limba romana. :)

Cod: Selectaţi tot
cout << "Introduceti numele fisierului: ";
No hai la treaba
Avatar utilizator
Dragos Cojocari
Fondator
Fondator
 
Mesaje: 727
Membru din: 11 Iul 2007, 14:11
Localitate: Cluj-Napoca

Re: Cititul unui fisier

Mesajde Sjack » 03 Feb 2010, 13:41

Da, mai trebuie sa invat multe pana sa inteleg cu adevarat ce mi-ai scris acolo zlatomir. Nu am idee cu ce se mananca vectorii astia...
Sa nu aveti impresia ca m-ati descurajat, eu doar imi cunosc limitele. Inca nu sunt capabil sa analizez un asemenea cod. Pentru mine e prea intortocheat. Si nu e vorba de lungimea codului... dar logica mea in c++ e slabuta deocamdata.
Las' ca progresez eu in timp :P.
Avatar utilizator
Sjack
Junior
Junior
 
Mesaje: 4
Membru din: 02 Feb 2010, 01:27

Re: Cititul unui fisier

Mesajde tudor_t » 03 Feb 2010, 14:42

Sjack scrie:Sa nu aveti impresia ca m-ati descurajat, eu doar imi cunosc limitele. Inca nu sunt capabil sa analizez un asemenea cod.

Nu e mare filozofie - de ex., pentru inceput nu e nevoie sa intelegi cum functioneaza intern clasa vector - trebuie doar sa intelegi principiul de baza, care il poti afla usor cautand documentatia clasei respective pe Google sau in MSDN..
Daca cunosti alte limbaje sau libraries, poti cauta o analogie - de ex. vector din STL seamana (oarecum) cu List<T> din .NET, sau cu dynamic arrays din Delphi ("array of" fara a specifica dimensiunea)
tudor_t
Membru
Membru
 
Mesaje: 52
Membru din: 26 Aug 2007, 15:11

Re: Cititul unui fisier

Mesajde zlatomir » 03 Feb 2010, 14:55

Dragos, intradevat se scrie fara liniuta, am o mica scuza si anume ora la care a fost scris comentariul :oops: si un lucru imbucurator pentru mine e faptul ca am facut greseala la limba romana, nu la "limba" c++ :thumbsup: (am o scuza sunt sarb ;) pe jumatate, dar nu stiu sarbeste asa ca totusi ar trebui sa invat romana corect).

using namespace std; //nu e recomandat in proiecte mai maricele, pentru ca poti avea un conflict de nume, uite si un exemplu "asa nu" in legatura cu denumirea variabilelor:
Cod: Selectaţi tot
#include<iostream>
//Nu folosim using namespace std;
int main(){
    int cout = 10; /* da, e variabila de tip int numita cout, ATENTIE: nu e recomandat sa denumesti variabile asa, dar se poate intampla din neatentie intr-un proiect mai mare*/
    std::cout << "Variabila denumita cout are valoarea: " << cout << std::endl;
    return 0;
}


In legatura cu vector si string, citeste link-urile pe care ti le-am postat si o sa le intelegi, chiar sunt usor de inteles, daca nu intelegi ceva anume postezi aici si incercam noi sa clarificam.
Aici ai o carte, scrisa de Herb Schildt si oferita gratis de microsoft (format xps, dar ai si pdf putin mai jos in pagina) http://msdn.microsoft.com/en-us/beginner/cc305129.aspx
Avatar utilizator
zlatomir
Membru
Membru
 
Mesaje: 175
Membru din: 04 Iul 2009, 23:59
Localitate: Arad->Felnac

Re: Cititul unui fisier

Mesajde Sjack » 03 Feb 2010, 19:42

Uite pentru ce vroiam eu initial sa citesc dintr-un fisier cuvintele... oricum am renuntat.
Am facut un fel de generator de poezii... nu va agitati, nu au nici un sens.... dar hey, l-am facut asa de distractie :P
Are 200 de cuvinte in total cu care sa se "joace" si sa dea crash cand gaseste un cuvant la care nu-i gaseste rima :thumbsup:

Link cu download pe blogul meu

Oh apropo, degeaba imi spuneti mie de clase. Inca n-am ajuns acolo. Stiu ca e motivul principal al denumirii "OOP", si c++ initial s-a numit "C with classes", dar nu sunt decat la pointeri...
Zlatomir, nu-mi da carti pentru lectura, ca am deja una si mai citesc si pe net unele chestii. Vreau sa o iau incetisor, fiindca programarea nu e chiar usoara. Pai daca vreau pana maine invat despre clase si ma pot lauda ca le stiu... si peste o saptamana nu mai stiu ! :D
Avatar utilizator
Sjack
Junior
Junior
 
Mesaje: 4
Membru din: 02 Feb 2010, 01:27

Re: Cititul unui fisier

Mesajde Marius Bancila » 03 Feb 2010, 22:10

Pentru un tutorial despre vector, iti sugerez acest articol (in engleza): http://www.codeguru.com/cpp/cpp/cpp_mfc ... php/c4027/.
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog
Avatar utilizator
Marius Bancila
Fondator
Fondator
 
Mesaje: 1777
Membru din: 11 Iul 2007, 11:45
Localitate: Timisoara


Înapoi la Limbajul C++

Cine este conectat

Utilizatorii ce navighează pe acest forum: Niciun utilizator înregistrat şi 1 vizitator

cron