Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: stavros 07. 10. 2013, 20:32:39

Název: Kde je chyba? (C++)
Přispěvatel: stavros 07. 10. 2013, 20:32:39
Ahoj, byl bych vděčný za pomoc, při nalezení chyby. Učím se třídy a chtěl bych, aby to zobrazilo text ze souboru. Nenačítá to ale nic. Díky za pomoc.
 

 GNU nano 2.2.6                             Soubor: main.cpp                                                               

Kód: [Vybrat]
#include<iostream>
#include<fstream>
using namespace std;
class Stream
{
public:
Stream(char);
~Stream();
char VypisObsahSouboru()const;
private:
char *na;
};
Stream::Stream(char ininazev)
{
na=new char;
*na=ininazev;
}
Stream::~Stream()
{
delete na;
}
char Stream::VypisObsahSouboru()const
{

ifstream fin(na);
char znak;
while (fin.get(znak))
cout<<znak;
fin.close();
return 0;
}
int main ()
{
char a;
cout<<"Nazev souboru\n";
cin>>a;
Stream MStream(a);
cout<<MStream.VypisObsahSouboru();
return 0;
}
Název: Re:Kde je chyba?(C++)
Přispěvatel: m 07. 10. 2013, 21:02:44
http://en.wikipedia.org/wiki/C_data_types

char: smallest addressable unit of the machine that can contain basic character set. It is an integer type. Actual type can be either signed or unsigned depending on the implementation.
Název: Re:Kde je chyba?(C++)
Přispěvatel: kolemjdoucí 07. 10. 2013, 21:09:51
Ten kód funguje, ale soubor musí mít jednopísmenný název :). Název souboru se totiž ukládá jako znak.
Název: Re:Kde je chyba?(C++)
Přispěvatel: postula 07. 10. 2013, 21:26:26
Pozor, kód fungovat pro jednopísmenné názvy nutně nemusí, autor alokuje char do něhož načte jeden znak ve vstupu, ale konstruktoru ifstreamu ten char* předává ve významu stringu! Takže pokud za oním charem nebude v paměti následovat '\0', přečte si konstruktor nějaké nesmysly za tím.

Jinak pro autora je chyba opravdu v tom jednom znaku, pro uložení názvu v C++ doporučuji std::string.
Název: Re:Kde je chyba?(C++)
Přispěvatel: stavros 07. 10. 2013, 21:44:13
Díky všem za vysvětlení.
Název: Re:Kde je chyba? (C++)
Přispěvatel: rob 08. 10. 2013, 10:10:10
Tenhle kod je kontextove spatne.
Kód: [Vybrat]
Stream::~Stream()
{
delete na;
}
Nikde nevidim dynamickou alokaci.

Dale taky ignorujete zapouzreni.

I kdyby jste alokoval v mainu char a na heapu, tak to uvolnovat z v instanci MStream si zakladate na poradnej prusvih.

Pokud si hrajete se streamy a zakl. datovy typy, dejte si pozor na char * a <<, chova se to nestandardne :)