Zadání názvu souboru – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Zadání názvu souboru – C / C++ – Fórum – Programujte.comZadání názvu souboru – C / C++ – Fórum – Programujte.com

 

Mirek Braho0
Stálý člen
24. 4. 2007   #1
-
0
-

Ach jo ... lidičky pomoc, proč mi zas nefunguje tohle ? :( ->

string *name = new string;

char a=160;

cout <<"Zadejte n"<<a<<"zev souboru: ";
cin >>*name;

ifstream soubor;
soubor.open(*name);


Normálně v tom *name je ten název co tam zadá uživatel, ale hlásí mi to chybu na řádku soubor.open(*name) ... Vim že v tý závorce by měl bejt char dle referencí. Ale jak to teda udělat? To mam zase definovat pevně stanovený pole char *b[1000]= new char ?? Chci se vyhnout pevně zadávanejm hodnotám. Nebo to bez toho nejde ? Jak udělat, aby místo toho 1000 se tam hodilo samot o číslo podle délky názvu? :(

Nahlásit jako SPAM
IP: ...–
Ady
~ Anonymní uživatel
5 příspěvků
24. 4. 2007   #2
-
0
-

string name;
char a=160;

cout <<"Zadejte n"<<a<<"zev souboru: ";
cin >> name;

ifstream soubor;
soubor.open(name);

Nahlásit jako SPAM
IP: ...–
Mirek Braho0
Stálý člen
24. 4. 2007   #3
-
0
-

Stále stejný. Píše mi to tuhle chybu:

23 C:\DATA\C++\test1.cpp no matching function for call to `std::basic_ifstream<char, std::char_traits<char> >::open(std::string&)'

mam tam jeste

#include <string>

To by mělo bejt správně ne ?

Nahlásit jako SPAM
IP: ...–
sn3d0
Věrný člen
24. 4. 2007   #4
-
0
-

neskusal som ale dohod si tam este #include <fstream>

Nahlásit jako SPAM
IP: ...–
shutdown -h now
Mirek Braho0
Stálý člen
24. 4. 2007   #5
-
0
-

To sn3d: :) Ten tan mam... radsi to sem hodim cely, sice je to jen pulka, ale ten zbytek je v tomhle problemu nepodstatnej.

#include <iostream>

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

using namespace std;

int main()
{
char *ch = new char;
int *k = new int;
string name;
char a=160;

cout <<"Zadejte n"<<a<<"zev souboru s titulky: ";
cin >>name;
cout << name;

ifstream soubor;
soubor.open(name);

if (!soubor) { cout << "Soubor nenalezen!" ; }

Nahlásit jako SPAM
IP: ...–
Mirek Braho0
Stálý člen
24. 4. 2007   #6
-
0
-

Divný je, že při deklaraci mi to píše INT i CHAR tučně, ale to STRING to píše normálně, jako by ho to právě neznalo :/ Není chyba někde v tom ?
Je to v DEV-C++ v. 4.9.9.2

Nahlásit jako SPAM
IP: ...–
Mirek Braho0
Stálý člen
24. 4. 2007   #7
-
0
-

BINGOOOOOOOOOOO ... funkce c_str() převádí string na char (musel tam bejt char a ne string)

#include <iostream>

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

using namespace std;

int main()
{
char *ch = new char;
int *k = new int;
string name;
char a=160;

cout <<"Zadejte n"<<a<<"zev souboru s titulky: ";
cin >>name;
cout << name;

ifstream soubor;
soubor.open(name.c_str());

if (!soubor) { cout << "Soubor nenalezen!" ; }

Nahlásit jako SPAM
IP: ...–
sn3d0
Věrný člen
24. 4. 2007   #8
-
0
-

hehe no pekne :) dobry smer.. ked uz sam odhalujes kde o zadrhava ;)

Nahlásit jako SPAM
IP: ...–
shutdown -h now
Peter D.0
Expert
25. 4. 2007   #9
-
0
-

najlepšie si človek niečo zapameta, keď to hodinu rieši, už ma nervy a mlati do klavesnice a potom to vyrieši, ako ked mu to niekto poradi.

Nahlásit jako SPAM
IP: ...–
Program nemusi fungovat rychle, staci ze funguje dostatecne rychle.
PaLaDiN
~ Anonymní uživatel
30 příspěvků
25. 4. 2007   #10
-
0
-

char *ch = new char;
int *k = new int;

toto ma preboha aky zmysel?!
char, int su premenne ktore sa ukladaju stale v zasobniku, a tymto si akurat tak robis problemy pri ich opatovnom mazani.. je to uplne zbytocne v pripade, ze obycajne premenne nechces potom nahradit dynamickym polom a tie stare obycajne zabudnut kde su.

staci
int k;
char ch;

spravi to uplne to iste ako ten tvoj kod (uplne nie .. ale konecny zmysel bude UPLNE rovnaky)

Nahlásit jako SPAM
IP: ...–
Peter D.0
Expert
25. 4. 2007   #11
-
0
-

no pomocou new to alokuje na hromade, kde je viac miesta :)

Nahlásit jako SPAM
IP: ...–
Program nemusi fungovat rychle, staci ze funguje dostatecne rychle.
Mirek Braho0
Stálý člen
26. 4. 2007   #12
-
0
-

To PaLaDiN: No vim, že to udělá to samý. Ale jak jsem četl tutoriály tady, tak Curo psal, že by se všechny proměnné měli alokovat až za běhu programu pomocí NEW ne ? Když se program větví, tak jen v té větvi, která bude aktuální (bude se vykonávat) se alokuje místo pro její proměnné, ale pro proměnné ve druhé větvi ne. Když tam nedam new, tak se alokují všechny proměnné z celého programu najednou ne ? Účel je myslim úspora paměti. A mě to žádné problémy nedělá, když deklaruju int *a = new int a pak všude píšu *a=1 apod. Proč to nepsat tak, když je to to samý jako int a .... a=1.

Akurát na konci programu mam navíc delete a. Ale to přežiju :P

Nahlásit jako SPAM
IP: ...–
Mirek Braho0
Stálý člen
26. 4. 2007   #13
-
0
-

PaLaDiN píše:#
# char *ch = new char;#
# int *k = new int;#
##
#toto ma preboha aky zmysel?!#
#char, int su premenne ktore sa ukladaju stale v zasobniku, a tymto si akurat tak robis problemy pri ich opatovnom mazani.. je to uplne zbytocne v pripade, ze obycajne premenne nechces potom nahradit dynamickym polom a tie stare obycajne zabudnut kde su.#
##
#staci#
#int k;#
#char ch;#
##
#spravi to uplne to iste ako ten tvoj kod (uplne nie .. ale konecny zmysel bude UPLNE rovnaky)



A když už jsi to naťuknul ... Jak mam pomocí ukazatelů udělat dynamické pole? Tedy char[] bez pevně stanoveného počtu znaků? Ještě mi to pořádně nikdo nevysvětlil a docela bych to chtěl vědět, protože je to dle mého užitečná věc. V mnoha případech dopředu nevím, jak to pole bude nakonec velké (vím že jsou na to lepší vektory, ale pole mě zajímaj taky :) )

Jooo a pomocí new ... verze s malloc se mi moc nelíbila, nějaký složitý mi to přišlo a je to myslim i C zápis a ne C++ (možná se pletu).

Díkes

Nahlásit jako SPAM
IP: ...–
midin
~ Anonymní uživatel
320 příspěvků
26. 4. 2007   #14
-
0
-

To vollf82:

Akurát na konci programu mam navíc delete a. Ale to přežiju :P


Není to o tom, přežít to, jako o tom ušetřit si čas a zjednodušit práci.

Nahlásit jako SPAM
IP: ...–
Mirek Braho0
Stálý člen
27. 4. 2007   #15
-
0
-

To midin:

Myslim, že připsat na konec 8 znaků mi zabere asi 2 sekundy :) ... Mě to prostě přijde efektivnější, a taky jsem zvyklej dělat věci od začátku pořádně, abych se to naučil. Když pak budu dělat někdy program, kterej bude tak velkej, že bude zabírat desítky, možná stovky MB paměti, těžko se tam obejdu bez ukazatelů. To by pak nezabíral desítky MB ale možná nějaký GB. Od toho ty ukazatele jsou ne ? Vím, že u takhle jednoduchejch prográmků asi postrádaj smysl, ale já se rozhodnul je používat pořád a vždy, abych si na ně zvyknul.

Viz. Curo:

Možná stále nerozumíte - "proč bych měl používat něco, co je zbytečné, těžké... proč bych měl pracovat s nepojmenovanou pamětí, když můžu jednoduše pracovat s proměnnou?"
Odpověď je jednoduchá - klasické proměnné alokují paměť v době kompilace, kdežto alokovaná paměť pomocí operátoru new se alokuje ZA běhu programu - tedy pouze tehdy, pokud bude využita, potřebná... Klasická proměnná se vždy "přihlásí" o své místo na začátku běhu programu. Ale co když nepotřebujete tolik proměnných? Co když se ukáže, že některé proměnné nebudou za celý běh programu ani jednou využity? Myslíte si, že to není možné? A co podmínky? Jestliže uživatel zadá ano, provede se určená část programu. Takže možnost "ne" zůstane neupotřebena a veškerý následující kód po této podmínce nebude upotřeben - ani proměnné. Tedy zbytečně jste plýtvali místem. Kdežto při alokaci paměti během programu se vám toto nestane - paměť se alokuje pouze tehdy, je-li to nutné. Možná si říkáte, proměnné jsou jednodušší..., ale vy si nemůžete poté u složitějších programů plýtvat pamětí!! Určitě vás u nových her štve, že mají takové hardwarové nároky. Takže neučte se zavrhovat a odsuzovat alokoci paměti za běhu programu, naopak, naučte se to používat. No a proč tedy ukazatele? No přeci proto, abyste nějak mohli s danou pamětí pracovat.

Nahlásit jako SPAM
IP: ...–
midin
~ Anonymní uživatel
320 příspěvků
27. 4. 2007   #16
-
0
-

To vollf82: Potom tedy OK.

Nahlásit jako SPAM
IP: ...–
ok
~ Anonymní uživatel
6 příspěvků
28. 4. 2007   #17
-
0
-

To vollf82: V tom pripade me udivuje, ze string, coz je trida, alokuj staticky, kdezto jednoduche promenne (int, char) alokujes dynamicky. Efektivne je to prave naopak. Pri slozitejsich konstrukcich (v tomhle pripade je to prakticky jedno) je efektivnejsi (jak prostorove, tak casove) pracovat se strukturami, tridami a poli pomoci ukazatelu. Pracovat pomoci ukazatelu s jednotlivymi cisly a znaky (char, int, double, ...) nema obvykle zadny smysl. Navic v tomto pripade je to vyrazne pomalejsi, nebot specialne alokujes a dealokujes, kdezto prekladac zlvadne naalokovat vsechny lokalni promenne pomoci jedineho pricitani (tedy jedine instrukce). Je to dokonce i prostorove narocnejsi (= narocnejsi na pamet), protoze potrebujes misto na ten pointer + misto na ten int, bez pointeru ti staci jenom misto na int.

Nahlásit jako SPAM
IP: ...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 26 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý