Nastavení velikosti pole pro čtení řádku z txt. – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Nastavení velikosti pole pro čtení řádku z txt. – C / C++ – Fórum – Programujte.comNastavení velikosti pole pro čtení řádku z txt. – C / C++ – Fórum – Programujte.com

 

lukas0110
Duch
18. 12. 2011   #1
-
0
-

Z textového dokumentu čtu jednotlivé řádky:

FILE *soubor;
char pole[80];

if((soubor=fopen("seznam pisni.txt","r"))==NULL)
	printf("Nastala chyba pri otevreni souboru!\n");
else 
	printf("Soubor se otevrel\n");

do
{
fgets(pole, 79, soubor);
printf(pole);

}
while(!feof(soubor));

fclose(soubor);

Chtěl bych se zeptat, jestli existuje způsob nastavení velikosti pole, který by mi umožňoval, abych nepsal konstantní hodnotu např. 80? Například bych měl na řádku pouze jedno slovo o 5 znacích a velikost pole by se změnila z 80 na 5. Dá se to nějak? Předem díky moc za odpověď.

Nahlásit jako SPAM
IP: 89.176.183.–
crazy
~ Moderátor
+10
Grafoman
18. 12. 2011   #2
-
0
-

dynamická alokace paměti?

Nahlásit jako SPAM
IP: 147.32.113.–
All you need is vision and time.
Peppy0
Stálý člen
18. 12. 2011   #3
-
0
-

 Prosím:

char* pole = new char[n]; // pole s n znakmi.
Nahlásit jako SPAM
IP: 85.135.167.–
Qt, QML, C++
lukas0110
Duch
18. 12. 2011   #4
-
0
-

#3 Peppy
Mohlo by to tak přibližně vypadat?

FILE *soubor;

int n;
char* pole = new char[n];

if((soubor=fopen("seznam pisni.txt","r"))==NULL)
	printf("Nastala chyba pri otevreni souboru!\n");
else 
	printf("Soubor se otevrel\n");

do
{
fgets(pole,n-1, soubor);
n=strlen(pole);
printf(pole);

}
while(!feof(soubor));

fclose(soubor);

Na netu jsem našel, že funkce strlen() vrací počet významných znaků řetězce (bez zarážky), tak jsem to využil.Bohužel mám někde chybu a já nevím kde.

Nahlásit jako SPAM
IP: 89.176.183.–
Peppy0
Stálý člen
18. 12. 2011   #5
-
-1
-
Mimo téma

#4 lukas011
No nie, nemôže. Teória tvojho príkladu:

  1. číslo n je neinicializovaná premenná. Väčšinou priradí nulu.
  2. Vytvoríš 0-prvkové pole (a to je čo?)
  3. chýbajú ti zložené zátvorky
  4. načítava reťazec dlhý n-1 = -1 znakov.
  5. n je dĺžka poľa (tj. vždy 0)
  6. Vypíše nula prvkov na plochu...
Nahlásit jako SPAM
IP: 85.135.167.–
Qt, QML, C++
crazy
~ Moderátor
+10
Grafoman
18. 12. 2011   #6
-
+2
-
Zajímavé

#5 Peppy
jak si přišel na to, že neinicializovaná proměnná má hodnotu 0? má  nedefinovanou hodnotu - tzn. že má takovou hodnotu, jaká je zrovna na místě v paměti, kde si ten int vytvořil...

Nahlásit jako SPAM
IP: 147.32.113.–
All you need is vision and time.
m4r100
Návštěvník
18. 12. 2011   #7
-
0
-

Proste musis alokovat tu pamet az kdyz vis kolik ji budes potrebovat :D to da rozum

Nahlásit jako SPAM
IP: 85.71.208.–
vitamin+8
Grafoman
18. 12. 2011   #8
-
0
-

Alebo nacitavat riadky po blokoch a tie spajat ako zretazeny zoznam.

Nahlásit jako SPAM
IP: 178.143.60.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
lukas0110
Duch
19. 12. 2011   #9
-
0
-

#7 m4r10
Problém je v tom, že nevím jak mám zjistit kolik té paměti budu potřebovat.

Nahlásit jako SPAM
IP: 89.176.183.–
liborb
~ Redaktor
+18
Guru
19. 12. 2011   #10
-
+1
-
Zajímavé

A to neví nikdo. Věděl by si to v případě, že by sis ten soubor prošel a tu délku řádky si zjistil. Takže se to dělá buď tak, že si nadefinuješ "dostatečně dlouhý buffer" (na začátku znáš (jednoduše zjistíš) délku souboru ...) nebo začneš s "malých" bufferem a když je potřeba, tak přidáš (realloc). Nikdo neřeší, co dělat v případě, že mám buffer na 80 znaků a řádek je dlouhý jen 5 znaků - to je případ, který mají všichni rádi :).

Nahlásit jako SPAM
IP: 78.80.52.–
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, 35 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ý