
C - pridavanie cifier do celociselnej premennej
Ahoj chcem sa spytat ked chcem dat do prvku pola cislo zo suboru ktore ma viac cifier ako to spravim??
Ahoj chcem sa spytat ked chcem dat do prvku pola cislo zo suboru ktore ma viac cifier ako to spravim??
Zpět do poradny Odpovědět na původní otázku Nahoru
Načteš ho ve správném formátu pomocí fscanf.
fscanf
a o jaky format sa prosim ta konkretne jedna?
To číslo v souboru je jaké? Celé, desetinné, hexa, ... ?
celociselne
fscanf (pFile, "%d", &pole[i]);
pFile je ukazatel na soubor
%d je formát čísla, které to má přečíst (integer)
&pole[i] je ukazatel na prvek v poli s indexem i, do kterého se to má uložit. Muže to být i ukazatel na proměnnou a typ int.
Ale v tom subore je viac cisiel ma to formu takuto 46549 45 1318 48654 atd. a je ich tam 500 000 no. A ten fscanf zobere cely file nie??
Tak volej fscanf v cyklu, dokud nenarazíš na EOF. Při jednom volání vrátí jedno číslo.
aha takze to scanf funguje tak ze pokial nenarazi napr. na medzeru tak bere cele cislo ano?? To je parada diky moc
Ano, v tomto případě vrací celá čísla a přeskakuje mezery.
Ahoj spravil som to ako som mal? pretoze mi to vypise same nuly ked na konci dam vypisat pole nevies co s tym je?? dakujem
#include <stdio.h>
#include <stdlib.h>
#include "Qsort_uloha.h"
int main()
{
FILE *fr;
int i;
int j;
if ((fr=fopen("zapis.txt","r"))==NULL)
{
printf("Subor zapis.txt sa nepodarilo otvorit.\n");
}
while((i=getc(fr))!=EOF) //zistenie poctu cisiel v subore
{
if(i==' ')
{
j++;
}
}
int *p_pole=(int *)malloc(j*sizeof(int)); //dynamicka alokacia pola
printf("%d\n\n",j);
j=0;
while((i=getc(fr))!=EOF) //naplnenie pola cislami z textoveho suboru
{
fscanf(fr,"%d",&p_pole[j]);
j++;
}
for(i=0;i<100;i++)
{
printf("%d\n",p_pole[i]); //vypis prvkov pola po 100 iba na kontrolu
}
free(p_pole);
p_pole=NULL;
fclose(fr);
return 0;
}
Po prvním cyklu while, jak tam počítáš čísla dej rewind(fr); aby se ukazatel vrátil na začátek souboru.
Ve druhém cyklu while nepoužívej getc, ale jen fscanf. Ten by měl vrátit nulu, jak narazí na konec souboru. Nebo testuj konec souboru pomocí feof.
http://www.cplusplus.com/reference/cstdio/feof/?kw =feof
Např. můžeš použít do while:
A nebo pomocí x dalších způsobů..
Pozn. není v tom zahrnuta kontrola překročení meze pole atd.
v obydvoch pripadoch mi spadne cely program ze system prestal pracovat spadne az po pasazi kde som dal vypisat pocet cisiel v subore nebude chyba v smerniku na pole?? Pretoze smerniky su moja slabina :D
Jo, možná to přistupuje za pole kvůli EOF.. Nevadí, všiml jsem si, že vlastně víš, kolik čísel budeš číst, tak menší úprava. Místo posledniho do while dej for:
A před tím tu proměnnou j nenuluj, ať v ní zůstane počet čísel a definuj int k;
Naaaadhera vsetko fici ako ma :) mas u mna velky respekt dakujem ti za tvoj cas a snahu :)
To sa bude pri takomto sposobe dost divit ak sa v tom subore raz nahodou objavi nejake pismeno :D
Ak to je len do skoly tak je to fuk. Profesionalny parsing sa zasadne robi uplne inac samozrejme (omnoho komplikovanejsie), ale to je o inom ;)
Tak samozřejmě. Pokud by to měl být univerzální program, musel by testovat a mít ošetřeno spoustu věcí. V rámci dotazu jsem se snažil poradit co nejrychleji tak, aby mu to fungovalo podle jeho představ. Ladění a optimalizace jsou už na něm..
Jasne ja to chapem (tiez by som mu tu neprogramoval parser), len som chcel dotazovatela upozornit na to ;)