theparasite Posted April 20, 2015 Report Posted April 20, 2015 Salut?ri RSTFORUMS. Cum citesc de la cap?t un fi?ier text?Eu am nevoie de structura care-mi poate citi fi?ierul de la cap?t spre început. Quote
Active Members MrGrj Posted April 20, 2015 Active Members Report Posted April 20, 2015 Ce ai incercat pana acum ?Aici nu se rezolva temele. Ne arati cum gandesti si te indrumam cu placere. Quote
theparasite Posted April 20, 2015 Author Report Posted April 20, 2015 Decât s? vi cu un r?spuns a?a banal ca acesta, mai bine nu te b?ga.Ce am încercat?Am nevoie doar de secven?a de citire a unui fi?ier de la coad? pentru rezolvarea a unui program eficient. Nu am nevoie de teoriile tale pentru teme ?i alte rahaturi. Doar de asta am nevoie, nu am idee care este ?i nici pe internet nu g?sesc mare lucru. De asta am apelat aici, în speran?a c? cineva îmi va spune. Mul?umesc 1 Quote
Active Members MrGrj Posted April 20, 2015 Active Members Report Posted April 20, 2015 Bun. Hai sa o luam cu inceputul.1. Indiferent ca e tema sau nu, iti foloseste, nu ? Nu sunt maica-ta sau altcineva ca sa iti tin eu predici.2. Esti arogant si ai 4 posturi chiar daca esti de 2 ani pe forum.3. #include <iostream>#include <fstream>#include <string>#include <vector>int main(){ std::ifstream in("main.txt"); if (in.is_open()) { std::vector<std::string> lines_in_reverse; std::string line; while (std::getline(in, line)) { lines_in_reverse.insert(lines_in_reverse.begin(), line); } }}saustd::vector<std::string> lines_in_order; std::string line; while (std::getline(in, line)) { lines_in_order.push_back(line); }Al doilea e mai eficient Quote
S.L.C Posted April 20, 2015 Report Posted April 20, 2015 @theparasite Google skils -5000 (link, link) Quote
theparasite Posted April 20, 2015 Author Report Posted April 20, 2015 (edited) Tu e?ti cel care m-a tratat cu arogan??, nu eu. Eu doar am întrebat, este evident c? mi-am stors capul de idei referitoare la cum a? putea s? o fac, dar nu de?in cuno?tiin?ele necesare.Apreciez c? ai postat, dar nu în?eleg nimic. Acestea sunt singurele metode? S? m? explic pu?in.Am un program care con?ine 10000 numere într-un fi?ier text. Mi se cere afi?area penultimului num?r impar + pozi?ia lui. Am f?cut asta într-un while, dar condi?ia optim? este atunci când citesc s? fac citirea de la cap?t, pentru a nu fi nevoit s? trec prin 10.000 de numere pân? ajung la penultimul impar. #include <iostream>#include <fstream>using namespace std;int main(){ifstream f("BAC.TXT");int x, ok=0,impar,i=0;while(...citire de la coad? && ok<2) if(x%2==1) { ok++; impar=x; i++;}cout<<"Numarul este "<<impar<<" "<<"si pozitia lui este: "<<10000-i; return 0;f.close();} @S.L.C, îmi po?i da un sfat ?i f?r? s? m? judeci. Edited April 20, 2015 by theparasite Quote
M2G Posted April 20, 2015 Report Posted April 20, 2015 Am un program care con?ine 10000 numere într-un fi?ier text. Mi se cere afi?area penultimului num?r impar + pozi?ia lui. Ce inseamna pozitia lui? Linia pe care se gaseste sau un offset in bytes de la inceputul fisierului?Fisierul e garantat ca are acelasi numar de caractere pe fiecare rand?Pot sa existe linii goale? Quote
H3xoR Posted April 20, 2015 Report Posted April 20, 2015 Tu e?ti cel care m-a tratat cu arogan??, nu eu. Eu doar am întrebat, este evident c? mi-am stors capul de idei referitoare la cum a? putea s? o fac, dar nu de?in cuno?tiin?ele necesare.Apreciez c? ai postat, dar nu în?eleg nimic. Acestea sunt singurele metode? S? m? explic pu?in.Am un program care con?ine 10000 numere într-un fi?ier text. Mi se cere afi?area penultimului num?r impar + pozi?ia lui. Am f?cut asta într-un while, dar condi?ia optim? este atunci când citesc s? fac citirea de la cap?t, pentru a nu fi nevoit s? trec prin 10.000 de numere pân? ajung la penultimul impar. #include <iostream>#include <fstream>using namespace std;int main(){ifstream f("BAC.TXT");int x, ok=0,impar,i=0;while(...citire de la coad? && ok<=2) if(x%2==1) { ok++; impar=x; i++;}cout<<"Numarul este "<<impar<<" "<<"si pozitia lui este: "<<10000-i; return 0;f.close();} @S.L.C, îmi po?i da un sfat ?i f?r? s? m? judeci.E de apreciat modul prin care te-ai gândit s? rezolvi problema îns? trebuie s? te dezam?gesc. În contextul unui examen de bacalaureat, optimizarea respectiv? î?i poate aduce 0 puncte deoarece în programa de liceu nu se specific? ceva legat de seeking în fi?iere.Rezolvarea trebuie s? fie cât se poate de simpl?, chiar mediocr? dac? e s-o privim dintr-un punct de vedere mai critic, astfel nu vor exista probleme la corectur?, unde profesorii sunt de mai multe feluri ?i fiecare are o oarecare libertate în a depuncta anumite linii de cod pe care nu le în?elege.M? gândesc c? dac? te-ai gândit la varianta cu cititul de la cap la coad?, cu siguran?? ?tii s? rezolvi problema în varianta clasic?.Toate cele bune . Quote
theparasite Posted April 20, 2015 Author Report Posted April 20, 2015 (edited) @H3xoR, mi se cere s? o fac în mod eficient. S? parcurg clasic nu este eficient. Mul?umesc. Edited April 20, 2015 by theparasite Quote
H3xoR Posted April 20, 2015 Report Posted April 20, 2015 Pozi?ia lui = pozi?ia în fisier. Adic? ultimul num?r reprezint? pozi?ia 1000, penultimul 9999, primul 1, al doilea 2. La asta se refer?.Con?ine o singur? linie cu 10000 de numere separate printr-un spa?iu. Mi se cere s? afi?ez num?rul ?i pozitia penultimului num?r impar. Trebuie doar s? citesc de la coad? ?i totul se rezolv?, dar nu ?tiu cum... Metoda de mai sus mi se pare prea complex?, eu având un nivel novice în C++. @H3xoR, mi se cere s? o fac în mod eficient. S? parcurg clasic nu este eficient. Mul?umesc.Eficien?a la care face referire problema st? în faptul c? nu trebuie s? folose?ti vectori pentru memorarea datelor citite ?i nici s? faci mai multe parcurgeri. Dac? nu m? crezi, întreab? un profesor .Spor. Quote
theparasite Posted April 20, 2015 Author Report Posted April 20, 2015 @H3xoROkay. Tot nu am idee cum a? putea parcurge de la început pân? la final ?i s? afi?ez penultimul element impar + pozi?ia sa, f?r? s? folosesc vectori... Ai vreo idee? Quote
H3xoR Posted April 20, 2015 Report Posted April 20, 2015 @H3xoROkay. Tot nu am idee cum a? putea parcurge de la început pân? la final ?i s? afi?ez penultimul element impar + pozi?ia sa, f?r? s? folosesc vectori... Ai vreo idee?O idee de rezolvare:#include <iostream>#include <fstream>using namespace std;int main(){ int nr, a, b = 0; ifstream in("date.txt"); while (in >> nr) if (nr % 2 == 1) { a = b; b = nr; } in.close(); cout << "Penultimul numar impar este " << a << endl; return 0;}Singura excep?ie ar ap?rea atunci când exist? doar un singur num?r impar în fi?ier, dar m? gândesc c? este specificat undeva c? exist? cel pu?in 2 numere impare. ?i cu toate astea, dac? nu este speficicat, se poate repara.Salut!PS: Acum am observat c?-?i cere ?i pozi?ia.Dac? nu te prinzi cum ai putea s-o descoperi, scrie-mi un PM. Quote
MARIUSCS Posted April 20, 2015 Report Posted April 20, 2015 (edited) #include <iostream>#include <fstream>using namespace std;int main(){ int ultim = 0, penultim = 0, x, p = 0, p1 = 0, p2 = 0; fstream f("nr.txt", ios::in); while (f >> x) { p++; if (x % 2) { if (p1) { penultim = ultim; p2 = p1; cout << penultim << " " << p2 << endl; } ultim = x; p1 = p; } } cout << penultim << " " << p2; f.close(); system("pause"); return 1;}La nivelul nostru mai eficient decat atat nu il poti face decat cu 1, 2 variabile in -.Multumesc pentru challenge Edited April 20, 2015 by MARIUSCS Quote
S.L.C Posted April 20, 2015 Report Posted April 20, 2015 (edited) Nu stiu cat de mult ajuta dar incearca:#include <vector>#include <string>#include <fstream>#include <sstream>#include <iterator>#include <iostream>int main(int argc, char **argv){ // Defineste tipul de container pentru a usura munca // in caz ca dorim sa schimbam ceva mai tarziu typedef std::vector<int> data; // Deschide fisierul precizat std::fstream myfile("data.txt", std::ios_base::in); // Creaza un container de tip vector (definit mai sus) data nums; // Asigurate ca are spatiu initial pentru 10,000 de elemente // Pentru a evita re-alocarea mai tarziu nums.reserve(10000); // Creaza un container de tip string // pentru a stoca continutul fisierului text std::string str; // Du-te la sfarsitul fisierului myfile.seekg(0, std::ios::end); // Afla si aloca marimea fisierului in containerul de tip string // pentru a evita re-alocarea mai tarziu str.reserve(myfile.tellg()); // Intoarce-te la inceputul fisierului myfile.seekg(0, std::ios::beg); // Citeste tot continutul fisierului // in containerul de tip string alocat mai devreme str.assign((std::istreambuf_iterator<std::string::value_type>(myfile)), \ std::istreambuf_iterator<std::string::value_type>()); // Deschide containerul de tip string creat mai devreme // in asa fel incat sa poti extrage numerele precum ar fi un stream std::istringstream iss(str); // Variabila temporara de acelasi tip cu cea stocata in vectorul definit mai sus data::value_type num; // Citeste numerele din containerul de tip string // Acum daca datele sunt in memorie totul este mai rapid while (iss >> num) nums.push_back(num); // Defineste si un container pentru pozitii ce poate contine // poztii suportate de containerul cu numerele typedef std::vector<data::size_type> positions; // Alocheaza inca un vector pentru a stoca pozitiile numerelor impare positions pos; // Itereaza fiecare numar citit si daca este impar // stocheaza pozitia lui for (data::iterator itr = nums.begin(); itr != nums.end(); ++itr) { if (*itr % 2) // Adaugam pozitia elementului in vectorul cu pozitii pos.push_back(static_cast<positions::value_type>(itr - nums.begin())); } // Verifica daca avem mai multe numere impare // Nu ai specificat daca pozitia trebuie sa inceapa de la 0 sau 1 if (pos.size() > 1) // Afiseaza penultimul numar + pozitia lui std::cout << (pos[pos.size() - 2]+1) << " : " << nums[pos.at(pos.size() - 2)] << std::endl; else if (pos.size() == 1) // Avem un singur element deci std::cout << (pos[0]+1) << " : " << nums[pos.at(0)] << std::endl; else // Nu avem nici un numar impar std::cout << "nici un numar impar" << std::endl; return 0;}Testat pe MinGW GCC 4.9.2 Edited April 20, 2015 by S.L.C Quote
theparasite Posted April 20, 2015 Author Report Posted April 20, 2015 Rezolvat.Mul?umesc pentru ajutor ?i-mi cer scuze dac? am avut o atitudine nepotrivit?, dar problema m-a determinat s? am o fire mai agitat?. Quote
devid_king Posted April 29, 2015 Report Posted April 29, 2015 Ce ai incercat pana acum ?Aici nu se rezolva temele. Ne arati cum gandesti si te indrumam cu placere. Quote