» »

c++ Branje dolocene vrstica iz .txt-ja

c++ Branje dolocene vrstica iz .txt-ja

worxer ::

Lep pozdrav, jaz želim napisati program za viselce, in v txt formatu naj bi ble napisane razlicne besede, vsaka v svoji vrstici.
Jaz bi pa celel, da bi si program sam izbral vrstico iz .txt datoteke.

Upam da razumete, kaj mislim :)

snow ::

Naključno vrstico?
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins

worxer ::

Da vrstico program izbere sam ...
TXT fajl:
neki
beseda
beseda2
krneki

Prgram pa nakljucno zbere eno iz med teh besed in pove. oz. shrani v string beseda.

snow ::

Random: http://www.cplusplus.com/reference/clib...
Število vrstic moraš poznat, potem pa zgeneriraš naključno število in prebereš tisto vrstico.
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins

worxer ::

največji problem mi je sicer kak je ukaz da bere sam eno vrstico v datoteki.

ERGY ::

worxer je izjavil:

največji problem mi je sicer kak je ukaz da bere sam eno vrstico v datoteki.


Določiš vrstico, potem pa se sprehodi do te vrstice. If stavek če je ta vrstica, ki je določena in če je se prebere in tudi konča, drugače nadaljuje do konca, dokler ne pride do nje.

Lp

worxer ::

lahk napišeš kodo?

technolog ::

Tole je bl simpl kot si misliš...

Greš po celi datoteki znak po znak in šteješ nove vrstice, sepravi "\n" -je. Ko naletiš na tisti "\n", ki se ujema z ižrebano številko, začneš zajemat do naslednjega "\n"-ja. Skratka maš 3 vrstice kode.

hexor ::

char niz[100];

dat.getline(niz,100);

Tutankhamun ::

ifstream file;
string   vrstica;

file.open("bla bla");

getline(file, vrstica);
AMD Phenom QUAD 9950 Black Edition, 8GB

technolog ::

O čem vidva sanjata?

Tutankhamun ::

workser je napisal, kako se prebere vrstico. Drgač je pa že dobu odgovor v zasebnih sporočilih.
AMD Phenom QUAD 9950 Black Edition, 8GB

Zgodovina sprememb…

technolog ::

Ja, samo to je zelo neefektivno, če bi takole bral vrstive, šele n-to (n je naključno število) pa zapisal. Ker se vsakič kliče konstruktor za string.

hexor ::

Tako kot je odgovoril Tutankhamun :)

worxer ::

Naredil sem ... da mi prešteje št. vrstic, pa da random zbere eno izmed vrstic, zdj mam pa problem ... z izpisom tiste vrstice :D
    switch(igralcev) {
                     case 1 :
                          cout << "Igrali boste sami." << endl;
                          cout << "Izbiranje besede in stetje vrstic ..." << endl;
                          if (besede.is_open()) {
                                                while( besede.good() ) {
                                                        while(getline (besede, beseda, '\n')){
                                                                      stVrstic++;
                                                                      }
                                                        cout << "Vrstic je: " << stVrstic << endl;
                                                        
                                                        izpisi_vrstico = rand() % stVrstic + 1;
                                                        cout << "Izbral sem vrstico: " << izpisi_vrstico << endl;
                                                        
                                                        getline (besede,beseda);
                                                        if(izpisi_vrstico == stevilka) { 
                                                        cout << beseda << stevilka << endl;
                                                  besede.close();
                                                  break;
                                                  }
                                                  stevilka++;
                                                }
                          }
                          else cout << "Nemorem odpreti datoteke!" << endl; 
                          break;

Tutankhamun ::

Tehnolog neefektiven si ti, mogoče bi lahko kr v asemblerju kodo za branje napisu.
To je za šolo. Manj vrstic ko napišeš, manjša verjetnost je za napako.
AMD Phenom QUAD 9950 Black Edition, 8GB

technolog ::

Ok, I challenge you.

Napiš ti svojo verzijo in jaz bom napisal z manj vrsticami (po svoji metodi).

Zgodovina sprememb…

Tutankhamun ::

Challenge accepted :).
int main(int argc, char* argv[])
{
	std::vector<std::string>	vStrLine;
	std::ifstream				iFile;
	std::string					strLine;
	unsigned int				iSelectLine;

	iFile.open("y:\\test.srt");
	if (!iFile.is_open()) {
		std::cout << "Can't open file" << std::endl;
		return -1;
	}

	while (iFile.good()) {
		getline(iFile, strLine);
		vStrLine.push_back(strLine);
	}
	
	iFile.close();

	while (true) {
		std::cout << "Select line 1-" << vStrLine.size() << " (0 for exit): ";
		std::cin >> iSelectLine;

		if (iSelectLine == 0) break;

		if ((iSelectLine-1) >= vStrLine.size()) {
			std::cout << "Max line is " << vStrLine.size() << std::endl << std::endl;
		} else {
			std::cout << "Line content: " << vStrLine[iSelectLine-1] << std::endl << std::endl;
		}
	}

	return 0;
}


U bistvu je tiste kode samo 3 vrstice. Program je delal v prvo, brez debug-iranja :D.
+ samo na zacetku prebere datoteko, potem je ne potrebuje vec (vse je v memoriji)
+ malo kode
+ malo verjetnosti za napako
- bo tehnolog povedu

getline(iFile, strLine);
vStrLine.push_back(strLine);

std::cout << "Line content: " << vStrLine[iSelectLine-1] << std::endl;


najdu napakco :)
AMD Phenom QUAD 9950 Black Edition, 8GB

Zgodovina sprememb…

worxer ::

Torej, mi lahk kdo prosim napise kodo, za branje dolocene vrstice v fajlu. :)

Tutankhamun ::

worxer, ne se hecat. Takoj nad tabo sm napisu celo kodo. Prepiš pa zažen, da boš vidu kako dela. Cele 3 vrstice maš no.
AMD Phenom QUAD 9950 Black Edition, 8GB

ERGY ::

Ja on hoče kodo, ki bo v njegovem programčku delala :))

Tutankhamun ::

Un njegov programček je pa že tko FAIL. Najprej prebere vse vrstice, pride do konca datoteke, pol pa spet bere vrstico... Sanja se mi ne kaj je hotu narest.
worxer uzem program, pa tam kjer imam js izpis narejen (to je usa koda po iFile.close()), dodaj svojo kodo. Vsebino vrstice dobiš takole: strLine = vStrLine[iSelectLine];, kjer je iSelectLine številka vrstice od 0 do kolikor je vrstic - 1. Če pa to ne gre, pol pa nevem kaj nj rečem.

Js pa še kr čakam tehnologa :D.
AMD Phenom QUAD 9950 Black Edition, 8GB

Zgodovina sprememb…

worxer ::

hoto sm narest ... d pravo pršteje besede ... pol zbere random vrstico, pol pa naj bi uno vrstico ko je prebrau izpisau ... :)

Torej, strLine = vStrLine[iSelectLine]
iSelectLine ... je vrjetno intiger ne? (številka vrstice, katero js želim)
kaj je strLine pa vStrLine?

Tutankhamun ::

Sej je v moji kodi napisan kaj je kej. StrLine je string, vStrLine pa je vektor kjer so shranjene vrstice. Vektor si predstavli kot polje vrstic. Dodat mores se #include "vector".
AMD Phenom QUAD 9950 Black Edition, 8GB

worxer ::

kak vpišem vector notr kot vBeseda?
vector vBeseda;
nedela ...

Tutankhamun ::

Zakaj nočeš pogledat v mojo kodo?
vector <string>  vBeseda;

Pomeni da je to "polje" ki sprejema stringe. Recimo podobn kod bi napsiu string vBeseda[100];. Samo podobn, da me ne bo kdo napadu.
AMD Phenom QUAD 9950 Black Edition, 8GB

worxer ::

ok, tko sm naredu:
case 1 :
        cout << "Igrali boste sami." << endl;
        cout << "Izbiranje besede in stetje vrstic ..." << endl;
        if(besede.is_open()) {
                                if(besede.good() ) {
                                                    while(getline (besede, beseda, '\n')){
                                                                                            stVrstic++;
                                                                                            }
                                                    }
                                cout << "Vrstic je: " << stVrstic << endl;
                                izpisi_vrstico = rand() % stVrstic + 1;
                                cout << "Izbral sem vrstico: " << izpisi_vrstico << endl;
                                besede.close();
								beseda = vBeseda[izpisi_vrstico];
                                cout << beseda;
                                system("pause");
                            }
        else cout << "Nemorem odpreti datoteke!" << endl;
        break;

ampak, ko pride do vrstice: beseda = vBeseda[izpisi_vrstico];
se program zapre ...

worxer ::

Pa ti si car!! :)
Mal sm se poglobiv v tvojo kodo ... pa mojo in sem sestavo tko k more bit :) hvala :)

technolog ::

Tole je popolnoma funkcionalna koda... Tudi praktično 3 vrstice. Brez uporabe vektorjev in stringa sploh.

#include <iostream>
#include <fstream>
using namespace std;

int main() {
	int stVrstice=3; //željena vrstica
	
	ifstream file("in.txt");
	while(file.good()) {
		char c=file.get();
		if (stVrstice==1) cout << c;
		if (c=='\n') stVrstice--;
	}
}

Zgodovina sprememb…



Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Python - pomoč (strani: 1 2 3 )

Oddelek: Programiranje
10318149 (8897) black ice
»

Program ne deluje več (strani: 1 2 )

Oddelek: Programiranje
506613 (5351) Genetic
»

c++ BRANJE IZ DATOTEKE

Oddelek: Programiranje
202577 (1990) Tutankhamun
»

[C++] Problem z datotekami in sortiranjem

Oddelek: Programiranje
271335 (964) BigWhale
»

c++ datoteke

Oddelek: Programiranje
464059 (3548) Vesoljc

Več podobnih tem