» »

[c++] branje iz datoteke v string, primerjava stringa in zapis v datoteko

[c++] branje iz datoteke v string, primerjava stringa in zapis v datoteko

R33D3M33R ::

V c++ bi rad spisal preprost programček, ki bi:

1. prebral datoteko primerjal če vsebuje določen string
2. če stringa ne vsebuje bi ga dodal v datoteko

OPOMBA: stringi so v datoteki ločeni po vrsticah

Zadeve pa nikakor ne uspem spraviti skupaj.
Uspelo mi je prebrati vsebino datoteke, zatakne pa se pri primerjavi če je string že v datoteki. Preprost if (str == "hello") nekako noče delovati in sem čisto zgubljen.
Torej koda prebere vsebino, težava je pri primerjanju

#include <iostream.h>
#include <fstream.h>
#include <string.h>

int main()
{
char str[2000];
fstream file_op("c:\\file.txt",ios::in);
	while(!file_op.eof())
    {
    file_op.getline(str,2000);
		if (str == "hello") {
		cout << str;
		}
	}
    file_op.close();
    return 0;
}


V datoteki je zagotovo niz "hello", če odstranim if pogoj namreč izpiše "hello". V čem je torej fora? A lahko kdo poda kak nasvet? Naj bi bila rešitev čimlažja. Na c++ se res ne spoznam.

Tak mimogrede - se to da na lažji način narediti v PERLu?
Moja domača stran: http://andrej.mernik.eu
Na spletu že od junija 2002 ;)
:(){ :|:& };:

DSmidgy ::

Mogoče je v vrstici zapisano "hello\n", ali "hello\n\r".

R33D3M33R ::

Datoteko sem ustvaril s TextPadom in ta mi kaže 1 vrstico. Sem pa tudi že poskusil hello dodati \n. Brez uspeha.
A je to sploh pravi način?
Moja domača stran: http://andrej.mernik.eu
Na spletu že od junija 2002 ;)
:(){ :|:& };:

DSmidgy ::

Kaj pa "\n\r"?

OwcA ::

char-ov ne moreš primerjati z ==, ampak s strcmp() ali še boljše uporabi raje std::string.
Otroška radovednost - gonilo napredka.

Good Guy ::

char kot posamezen znak lahko ampak stringov ne moreš:\
http://goo.gl/7ItKpU
Naj računalnik dela za vas^^

R33D3M33R ::

Sedaj sem uporabil strcmp() kot je predlagal OwcA:

Korigirana koda je:

#include <stdio.h>
#include <iostream.h>
#include <fstream.h>
#include <string.h>

int main()
{
char Niz[5] = "hello";
char str[2000];
fstream file_op("c:\\file.txt",ios::in);
	while(!file_op.eof())
    {
    file_op.getline(str,2000);
		if (strcmp(Niz,str) == 0) {
		cout << str;
		}
	}
    file_op.close();
    return 0;
}


Primer sem našel na tej strani in ga spremenil, ker sta stringa enaka če je vrednost 0 ane?
In v bistvu spet ne deluje :\
Kdo bi si mislil, da je c++ tako zakompliciran. Še enostavne stvari ne znam narediti :\
Moja domača stran: http://andrej.mernik.eu
Na spletu že od junija 2002 ;)
:(){ :|:& };:

Quikee ::

spremeni
char Niz[5] = "hello";

v
char* Niz = "hello";

oz.
char Niz[6] = "hello";


char Niz[5] = "hello"; naredi string, ki ne vsebuje null termination znaka na koncu, ker si dolzino stringa naprej definiral. GCC-ju tega niti ni uspelo skompilat.

snow ::

Prosim te, uporabi std::string, kot je predlagal že OwcA!
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins

SasoS ::

če uporabljaš getline() moraš pomoje pobrisat newline na koncu vrstice. Ali pa uporabi strstr() namesto strcmp()

Quikee ::

če uporabljaš getline() moraš pomoje pobrisat newline na koncu vrstice.
Ne rabis, ker se newline jemlje kot delimiter.

R33D3M33R ::

Quikee: bom probal
snow: sem pogooglal in našel isti rezultat kot si ga podal, kodo sem poskušal modificirati, ampak žal zadeva ne deluje.
Pogledal sem si primer in spremenil:

string::size_type loc = str.find("hello",0);

To sem vrgel med while zanko. Če prav razumem je tista ničla tam, da pač začne na začetku stringa in išče. Zakaj mi ne dela nimam pojma.
Verjetno ker imam char str[2000];
Katastrofa, če bi to delal v PHP bi rabil par minutk :(

Recimo da bi namesto char str[2000]; vzel string str;
Kako se potem spremeni getline()?
Moja domača stran: http://andrej.mernik.eu
Na spletu že od junija 2002 ;)
:(){ :|:& };:

Quikee ::

#include <iostream>
#include <fstream>
#include <string>

int main()
{
	std::string niz = "hello";

	std::string str;

	std::fstream file_op("/home/quikee/tst",std::ios::in);

	while(!file_op.eof()) 
	{
		std::getline (file_op, str);

		if (str.find(niz,0)) {
			std::cout << str;
		}

	}

    file_op.close();

    return 0;
}


Dela brez problema. =)

R33D3M33R ::

Hvala za kodo, ampak sem probal v fajlu, kjer je več vrstic pa mi noče delat kakor bi hotel. Sem se nehal ubadati s tem c++, ker ga očitno ne bom nikoli zastopil :( in sem si raje pogledal PERL in napisal 15 vrstic kode pa super dela :)
Hvala vam za pomoč, se opravičujem, da sem vam kradel čas, ampak c++ enostavno ne razumem. PERL mi je pa kristalno jasen (ker znam PHP).
Moja domača stran: http://andrej.mernik.eu
Na spletu že od junija 2002 ;)
:(){ :|:& };:

Gundolf ::

Zanimivo, C++ standard je star že ~8 let, pa se še najdejo ljudje, ki napišejo #include <fstream.h> namesto #include <fstream>. Dej R33D3M33R povej, kdo te je takega C++a učil, ker to me pa res zanima.

Drugače pa takole, malo karikirana C++ koda (pri tem da sama logika iskanja zasede le eno, morda dve vrstici ;)):
#include <fstream>
#include <string>
#include <algorithm>
#include <iterator>

using namespace std;

class Line : public string {};

template<class Stream>
Stream& operator>>(Stream& s, Line& l) {
	getline(s, l);
}

int main() {
	const char* seeking = "#include <fstream>";
	const char* filename = "main.cpp";
	
	ifstream file(filename);
	if (find(istream_iterator<Line>(file), istream_iterator<Line>(), seeking) == istream_iterator<Line>()) {
		ofstream outFile(filename, ios::app);
		outFile << seeking << "\n";
	}
}

R33D3M33R ::

Učil me ni nihče, osnove sem se naučil sam. Večinoma preko primerov, ki jih najdeš na internetu. Ne vem zakaj bi delal neki halo, če se namesto fstream.h piše fstream pa tako naprej. Če compiler to dobro prebavi, bom uporabljal tisto kar mi bolj paše.
In ja, očitno se sam ne bom mogel naučiti zadeve, ker mi enostavno ni logično zgrajena. Že pri tem zakaj moraš pisati enkrat short int, long int pa še kaj se zatakne. Ko pa pridejo še classi in podobne fore pa itak vse odpove. :(
Moja domača stran: http://andrej.mernik.eu
Na spletu že od junija 2002 ;)
:(){ :|:& };:

Gundolf ::

Sej te ne kritiziram (no v prejšnjem sporočilu te nisem ;)). Dejansko me je zanimalo od kod prihajajo nestandardne C++ stvari še danes na plan. Sem tudi malo sumil internet, čeprav ne izključujem, da se ponekod še vedno organizirano uči nestandardne zadeve.

Zdej pa da te še malo kritiziram - "Če compiler to dobro prebavi, bom uporabljal tisto kar mi bolj paše.". Ok, samo potem ne pričakuj pomoči od nikjer drugje kot od avtorjev compilerja. Headerji standardne knjižnice (kot so string, fstream, istream, algorithm itd) s končnico .h so nestandardni - ali bolj rečeno pred-standardni (štos ni v tem "kako ti pišeš" ampak da dejansko includaš drug fajl). In ker je trenutni standard že iz leta 98 je le malo čudno da še vedno prihajajo na dan. Njihova vsebina pa je kvečjemu podobna tisti iz standardnih headerjev in se razlikuje od compilerja do compilerja. Zato tak halo. Zato ker, če se greš nekaj novega učiti se menda ne boš učil nekaj, kar ni standardno, je zastarelo in (upam da) čez nekaj let sploh ne bo več na voljo.

Kar se pa učenja tiče, če se res rabiš naučiti C++, potem ti razni primeri iz interneta sigurno ne bodo dovolj. Včasih so zanimivi kaki tutoriali ali pa knjiga ampak je od človeka do človeka odvisno kakšen način učenja mu bolj leži.

Gundolf ::

Pa da ne bom le nakladal, tule je en link, na katerem se nahaja (takole po nahitro vrženem uču) relativno dober tutorial.

Kakšen je bil moj kriterij za dobor oceno tutoriala? Standardna knjižnjica ni omenjena pod advanced topics, isto velja za template, vectorji so omenjeni skupaj z arrayi... Poleg tega je zadeva ni prekratka, vsaj prvo poglavje je zelo berljivo, nasplošno daje dober občutek. No, če ga bo kdo poizkusil naj da kakšen feedback. Ker tutorial za C++ najdeš na vsakem koraku, dobrega pa zlepa ne.

Kami ::

Če smo že pri temi kdo nas tak uči, nas v šoli tak učijo (SERŠ).

Drugače pa sm si jaz že prej malo na netu bral pa uporabljam standardni način.

R33D3M33R ::

Headerji standardne knjižnice (kot so string, fstream, istream, algorithm itd) s končnico .h so nestandardni - ali bolj rečeno pred-standardni (štos ni v tem "kako ti pišeš" ampak da dejansko includaš drug fajl). In ker je trenutni standard že iz leta 98 je le malo čudno da še vedno prihajajo na dan. Njihova vsebina pa je kvečjemu podobna tisti iz standardnih headerjev in se razlikuje od compilerja do compilerja. Zato tak halo. Zato ker, če se greš nekaj novega učiti se menda ne boš učil nekaj, kar ni standardno, je zastarelo in (upam da) čez nekaj let sploh ne bo več na voljo.


Tega pa sploh nisem vedel. Vem da se headerji spreminjajo (nekako logično, da se delajo nove revizije), ampak tega, da se pa lahko zadeva v celoti spremeni pa nisem vedel. Pač nisem nikoli obiskoval kake računalniške šole ali pa kakega tečaja.

Kar se pa učenja tiče, če se res rabiš naučiti C++, potem ti razni primeri iz interneta sigurno ne bodo dovolj. Včasih so zanimivi kaki tutoriali ali pa knjiga ampak je od človeka do človeka odvisno kakšen način učenja mu bolj leži.


Saj sem imel knjigo doma. Ampak notri so bile pač tiste enostavne zadeve. Saj znam spisati recimo kak keygen, zadevo, ki kaj računa, uporabljati enostavno manipulacijo s stringi, ampak kaj bolj advanced mi je pa enostavno preveč.
Veliko bolj logični so mi jeziki tipa PERL, PHP, kjer so na voljo funkcije (in odličen manual mimogrede). Samo vstaviš, narediš kako zanko, if stavek in že imaš programčič, ki pa je žal odvisen od webserverja (PHP) ali perl knjižic.

/edit

Hvala za link na tutorial. Si ga bom ogledal, ko bo na voljo več časa.

LP
Moja domača stran: http://andrej.mernik.eu
Na spletu že od junija 2002 ;)
:(){ :|:& };:

Zgodovina sprememb…



Vredno ogleda ...

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

c++ fukncije in procedura

Oddelek: Programiranje
362363 (1632) roccat
»

c++ string problem

Oddelek: Programiranje
8733 (626) teey
»

C# serilizacija String

Oddelek: Programiranje
71019 (883) BlueRunner
»

int to string v c++

Oddelek: Programiranje
272239 (1967) OwcA
»

c++ datoteke

Oddelek: Programiranje
463830 (3319) Vesoljc

Več podobnih tem