Struktury a jejich uložení – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Struktury a jejich uložení – C / C++ – Fórum – Programujte.comStruktury a jejich uložení – C / C++ – Fórum – Programujte.com

 

eidam
~ Anonymní uživatel
8 příspěvků
27. 6. 2007   #1
-
0
-

Ahoj lidi,dělám si prográmek,který mimo jiné ukládá informace o stolech.Stoly se uloží do struktury "pub"Problém nastává,když chci CELOU strukturu uložit do souboru.Neskousne mi to překladač.Zkoušel jsem i zapsat každého člena (resp. stůl) zvlášť.Problém:



....
cout<<"INSTALUJI\nUkladam informaci o stolech";
ofstream tab("tables.jav",ios::out | ios::binary);
if (tab==0){
cerr<<"ERROR:Nepodareny zapis kodu!\n";
cin.get();
cin.get();
return 0;
}
if(tab!=0){
tab.write((const char*)&pub,sizeof(pub));//řádek 64(tento komentář tam není)
}
...

Píše to:
64 C:\Dev-Cpp\Templates\Install.cpp expected primary-expression before "const"
64 C:\Dev-Cpp\Templates\Install.cpp expected `)' before "const"


Pak bych potřeboval poradit,jak říct programu,aby uložil soubor do jiného adresáře,než je samotná aplikace.

Díky moc :)

Nahlásit jako SPAM
IP: ...–
svick0
Newbie
27. 6. 2007   #2
-
0
-

Zkusil jsem ten tvůj kód a mně jede bez chyb. Třeba bude chyba někde jinde, chtělo by to víc kódu, hlavně definice těch struktur.

Nahlásit jako SPAM
IP: ...–
Korespondenční seminář z programování pro středoškoláky - http://ksp.mff.cuni.cz
Jura
~ Anonymní uživatel
637 příspěvků
27. 6. 2007   #3
-
0
-

Kód vypadá v pořádku. Raději uveď celý kód(pokud možno aspoň větší úsek).

>>Pak bych potřeboval poradit,jak říct programu,aby uložil soubor do jiného adresáře,než je samotná aplikace.

Na Win třeba:

ofstream tab("ADRESAR\\tables.jav",ios::out | ios::binary);

Na *unix:

ofstream tab("/ADRESAR/tables.jav",ios::out | ios::binary);

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

Díky za adresáře,tady je celý kód:



#include <iostream>
#include <fstream>
using namespace std;
struct pub{
int cislo;
int obj[30];
int cena;
};
int main(){
cout<<"Dobry den,vita Vas program PUB.\nInformace si prectete v souboru \"read me.txt\"."<<endl;
cin.get();
kod:system("cls");
cout<<"*KROK 1*\nZadejte max. desetimistne ciselne pristupove heslo:"<<endl;
int kod;
cin>>kod;
system("cls");
cout<<"*KROK 1*\nZadejte max. desetimistne ciselne pristupove heslo znovu:"<<endl;
int kod2;
cin>>kod2;
if(kod==kod2)
goto dal;
else
cout<<"Spatne,zadat znova";
cin.get();
cin.get();
goto kod;
//***************************************
dal:system("cls");
cout<<"*KROK 2*\nZadejte pocet stolu:"<<endl;
int stoly;
cin>>stoly;
for(int i=stoly;i>0,i--;){
pub stul[i];
stul[i].cislo=i;
cout<<i<<"Zpracovavani informace o stolech\n";
};
system("cls");
cout<<"Stisknutim ENTERu spustite jenoduchou instalaci"<<endl;
cin.get();
cin.get();
system("cls");
cout<<"INSTALUJI\nZapis hesla";
ofstream pas("pass.jav",ios::out | ios::binary);
if (pas==0){
cerr<<"ERROR:Nepodareny zapis kodu!\n";
cin.get();
cin.get();
return 0;
}
if(pas!=0){
pas.write((const char *)&kod,sizeof(kod));
pas.close();
}
system("cls");
cout<<"INSTALUJI\nUkladam informaci o stolech";
ofstream tab("tables.jav",ios::out | ios::binary);
if (tab==0){
cerr<<"ERROR:Nepodareny zapis kodu!\n";
cin.get();
cin.get();
return 0;
}
if(tab!=0){
tab.write((const char*)&pub,sizeof(pub));
}
ofstream poc ("tablesnum.jav",ios::out);
if (poc==0){
cerr<<"ERROR:Nepodareny zapis kodu!\n";
cin.get();
cin.get();
return 0;
}
if(poc!=0){
poc.write((const char *)&stoly,sizeof(stoly));
poc.close();
}
system("cls");
cout<<"Instalace probehla spravne!"<<endl;
cin.get();
return 0;
}


To je cele.problem bude ve struktuře.

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

To eidam:

No to víš, že je problém ve struktuře. Malá nápověda:
Tohle je správně:



poc.write((const char *)&stoly,sizeof(stoly)); // tady ukladaš cele pole, ale stejne tak muzes ulozit i stoly[0], stoly[1]
poc.close();

Zatímco tady ukladáš co?
tab.write((const char*)&pub,sizeof(pub)); // nmeužeš uložit typ, ale proměnnou 


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

Jura píše:#
# To eidam:#
##
#No to víš, že je problém ve struktuře. Malá nápověda:#
#Tohle je správně:#
#

#
# poc.write((const char *)&stoly,sizeof(stoly)); // tady ukladaš cele pole, ale stejne tak muzes ulozit i stoly[0], stoly[1]#
# poc.close();#
#
#
#Zatímco tady ukladáš co?#
#
tab.write((const char*)&pub,sizeof(pub)); // nmeužeš uložit typ, ale proměnnou 
#
##
#



Trochu ti nerozumím.Když ukládám "stoly",tedy proud "poc",tak je to 1 proměnná.A kdyz jsem zkoušel zapsat každý stůl zvlášť do jednoho souboru


....
for(int a=stoly,a>0,a--){
tab.write((const char *)&stul[a],sizeof(stul[a]);//ale ted me napada,jestli to nebude zapomenutym pretypovanim v"sizeof((int)stul[a]);
}
tab.close();
....


Mám teda, jestli to není přetypováním,zapsat každý stůl do souboru zvlášť?Pokud jo,tak mi pomůže to psaní do jiného adresáře(kvůli tomu jsem se taky ptal).

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

To eidam:

Ne, já jen naznačoval, že ukládáš datový typ pub, místo toho, aby si uložil nějakou proměnnou typu pub.
Máš tam něco jako :



struct pub
{ ...
};
tab.write((const char*)&pub,sizeof(pub)); // tohle je nesmysl

Musíš si vytvořit proměnnou typu pub:
Tedy něco jako:


pub p;
// naplneni polozek
tab.write(reinterpret_cast<const char*> (&p), sizeof(pub)); // ulozeni



Nahlásit jako SPAM
IP: ...–
eidam
~ Anonymní uživatel
8 příspěvků
29. 6. 2007   #8
-
0
-

Tak jsem to asi pochopil,přepracoval kód:



#include <iostream>
#include <fstream>
using namespace std;
struct pub{
int cislo;
int obj[30];
int cena;
};
int main(){
cout<<"Dobry den,vita Vas program PUB.\nInformace si prectete v souboru \"read me.txt\"."<<endl;
cin.get();
kod:system("cls");
cout<<"*KROK 1*\nZadejte max. desetimistne ciselne pristupove heslo:"<<endl;
int kod;
cin>>kod;
system("cls");
cout<<"*KROK 1*\nZadejte max. desetimistne ciselne pristupove heslo znovu:"<<endl;
int kod2;
cin>>kod2;
if(kod==kod2)
goto dal;
else
cout<<"Spatne,zadat znova";
cin.get();
cin.get();
goto kod;
//***************************************
dal:system("cls");
cout<<"*KROK 2*\nZadejte pocet stolu:"<<endl;
int stoly;
cin>>stoly;
for(int i=stoly;i>0,i--;){
pub stul[i]; //Řádek 33
stul[i].cislo=i;
cout<<i<<"Zpracovavani informace o stolech\n";
};
system("cls");
cout<<"Stisknutim ENTERu spustite jenoduchou instalaci"<<endl;
cin.get();
cin.get();
system("cls");
cout<<"INSTALUJI\nZapis hesla";
ofstream pas("pass.jav",ios::out | ios::binary);
if (pas==0){
cerr<<"ERROR:Nepodareny zapis kodu!\n";
cin.get();
cin.get();
return 0;
}
if(pas!=0){
pas.write((const char *)&kod,sizeof(kod));
pas.close();
}
system("cls");
cout<<"INSTALUJI\nUkladam informaci o stolech";
ofstream tab("tables.jav",ios::out | ios::binary);
if (tab==0){
cerr<<"ERROR:Nepodareny zapis kodu!\n";
cin.get();
cin.get();
return 0;
}
if(tab!=0){
tab.write(reinterpret_cast<const char*> (&stul[stoly]), sizeof(pub)); //Tady je řádek 64
}
ofstream poc ("tablesnum.jav",ios::out);
if (poc==0){
cerr<<"ERROR:Nepodareny zapis kodu!\n";
cin.get();
cin.get();
return 0;
}
if(poc!=0){
poc.write((const char *)&stoly,sizeof(stoly));
poc.close();
}
system("cls");
cout<<"Instalace probehla spravne!"<<endl;
cin.get();
return 0;
}



Překladač mi to nesežere,prý je proměnná "stul"nenadeklarována:
64 | C:\Dev-Cpp\Install.cpp | `stul' undeclared (first use this function)
Ale já ji vytvořil dávno na řádku 33(viz kód)!
Pořád to nejede,prosím pomozte! :,-(

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
637 příspěvků
29. 6. 2007   #9
-
0
-

To eidam:

Já se mu ani nedivím. K tomu, aby jsi porozumněl té hlášce musíš vědět, co to je platnost proměnné. A ta platí vždy jen v tom bloku, tedy mezi { a },ve kterém je deklarována. Takže řešení je samozřejmě více, ale nejenodušš bude, když dáš deklaraci, kterou máš na řádku 33 před ten cyklus(řádek 31). Jinak snaž se vyhnout goto - jde to docela jednouše(pomocí cyklů, funkcí..).

Jo a do budoucna taková poznámka, když ukládáš stukturu jako celek, tak si dávej pozor na zarovnání. U takovéto homogenní struktury, jakou máš ty, to nebude vadit. To jen proto, aby jsi se v budoucnu nedivil, proc je soubor 4x tak větší než je kolik je součet jednotlivých položek struktury. Ale jak říkám, zatím ti to může být jendo.

Nahlásit jako SPAM
IP: ...–
eidam
~ Anonymní uživatel
8 příspěvků
29. 6. 2007   #10
-
0
-

To Jura:

Díky,ale to snad jinak než přes cyklus nejde!Vlastně jo:Zapsat proměnnou ještě v cyklu!
Jinak mnohokrát díky,ještě tady o mně uslyšíte :)

Nahlásit jako SPAM
IP: ...–
eidam
~ Anonymní uživatel
8 příspěvků
30. 6. 2007   #11
-
0
-

Ahoj,jak jde udělat,aby součástí řetězce char bylo číslo(myslím jako číslo=znak)? Ale musí to číslo jít měnit,souvisí to zase s tou proklatou strukturou.A taky to musí jít přetypovat na const char *.Chci vytvořit soubory např. Table1, table2, table3,...Ale aby to pak nedělalo blbosti jako "Table), Table(, Table>,atd."Jsu asi náročnej ale jinak to asi FAKT nejde!Už jsem zkoušel asi 10 možností,ale vždycky to zhavarovalo kvůli chybnému přetypování z int na const char*.Díky.

Nahlásit jako SPAM
IP: ...–
30. 6. 2007   #12
-
0
-

Moc nechapu dotaz, ale budiz...



bool int2str(int num, char *str, int size){

if(num < 0 || size == 1){
return false;
}

int z = num%10;
int d = num/10;
int i = 1;

char *revr = new char[size];
revr[0] = (char)(z+48);

while(d != 0){
z = d%10;
d = d/10;


if(i >= size){
delete [] revr;
return false;
}

revr[i] = (char)(z+48);
i++;
}

for(int n=0; n<i; n++){
str[n] = revr[i-n-1];
}
str[i] = '\0';

delete [] revr;

return true;
}

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
637 příspěvků
30. 6. 2007   #13
-
0
-
Nahlásit jako SPAM
IP: ...–
30. 6. 2007   #14
-
0
-

Jura píše:#
# To Zelenáč:#
##
#Co to je? Proč si to alespoň nevyzkoušíš?


Sem byl trosicku mimo ;-)

Nahlásit jako SPAM
IP: ...–
eidam
~ Anonymní uživatel
8 příspěvků
28. 8. 2007   #15
-
0
-

ofstream tab("ADRESAR\\tables.jav",ios::out | ios::binary);



Díky moc,ale jak donutit program aby ještě před uložením tu slozku vytvoril?pokud neexistuje,tak si ji sám neudela.

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, 23 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ý