Malý problém při čtení souboru – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Malý problém při čtení souboru – C / C++ – Fórum – Programujte.comMalý problém při čtení souboru – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Tom9k0
Newbie
22. 11. 2007   #1
-
0
-

Dobrý den, mám tu jeden menší problém, zkoušel jsem napsat funkci která by rozdělovala řetězec na základě nějakého oddělovače(něco jako je v pythonu funkce split). Řetězec se rozdělí na části a zapíše do souboru, ale při načtení souboru se nenačte vždy 1. znak na novém řádku, zkoušel jsem všechno možné, ale nevím, co s tím. Nejspíš to bude nějaká malá drobnost ve skriptu. Pomohl by mi někdo? Tady je skript:

#include <stdio.h>


char a[]="tohle;je;nejakej;text";

void split(char vstupni[200],char oddelovac){
char slova[200];
FILE *file=fopen("cache","w");
int delka=0;
int c=0;
for(int f=0;f<200;f++){
delka=f;
if(vstupni[f]==0)break;
}
for(int b=0;b<delka;b++){
if(vstupni==oddelovac&&b>0)fprintf(file,"\n");
else fprintf(file,"%c",vstupni);
}
fclose(file);
file=fopen("cache","r");
while(fscanf(file,"%s",&slova[c])!=EOF){
c++;
printf("%s\n",&slova[c]);
}
}

int main(){
split(a,(char)';');
getchar();
return 0;
}

Nahlásit jako SPAM
IP: 89.203.136.–
Reklama
Reklama
Tom9k0
Newbie
23. 11. 2007   #2
-
0
-

Tak už jsem na to přišel, šlo o to,že fscanf nečte vždy 1. znak,který následuje po mezeře nebo přechodu na novou řádku. Mám ale ještě jeden dotaz- potřebuji přidat k funkci "split" 3. třetí parametr- proměnnou typu char,do které funkce zkopíruje obsah proměnné "slova", ale nevím jak tento parametr nadefinovat, nikde na netu jsem nenašel, jak na to. Volání funkce by mělo vypadat nějak takhle: split( řetězec ke zpracování, oddělovač, proměnná char k nahrání). Doufám že jsem to dobře vysvětlil

Nahlásit jako SPAM
IP: 89.203.136.–
Zelenáč0
Posthunter
23. 11. 2007   #3
-
0
-

fce(char *k_nahrani){

char slova[200] = "neco";
strcpy(k_nahrani, slova);
}

Nahlásit jako SPAM
IP: 89.176.254.–
tmi0
Věrný člen
23. 11. 2007   #4
-
0
-

toto ti funguje?

void split(char vstupni[200],char oddelovac){

??? v cem to kompilujes?
mel by si to predavat jako ukazatel na ono pole, a dalsi parametr velikost toho pole(nepovinne)

tohle :

for(int f=0;f<200;f++){

delka=f;

if(vstupni[f]==0)break;

}


se da elegantneji vyresit pomoci funkce int strlen(const char *) z headeru string.h

vstupni == oddelovac

vis ze timto porovnavas ne znaky, ale ukazatele? tusim ze jsi chtel napsat spise
vstupni==oddelovac; //kde oddelovac=';'

fscanf(file,"%s",&slova[c])!=EOF

format %s nacte znakovy retezec, tedy posloupnost vsech znaku do nasledujiciho ws characteru. takze ti to precte retezec(slovo) a ulozi ho do adresy pocinaje &slova[c]. pak precte dalsi retezec a ulozi ho o byte dale, takze vzdycky nactes pouze jeden znak z kazdeho slova. fscanf standardne cte vsechny znaky.

k tvemu druhemu prispevku: predas funkci jako parametr adresu nejakeho pole (tedy ukazatel). vypadalo by to asi takto:
char pole[100];
void split(char *vstupni,char oddelovac, char *vystupni){
...blabla...

a ukazatel by jsi pouzival treba takto:
vystupni[0] = 'a';
vystupni[1]=vstupni[13];

Nahlásit jako SPAM
IP: 89.185.230.–
ksp.mff.cuni.cz -- doporučuje 5 z 0 přetečených bufferů!
Tom9k0
Newbie
23. 11. 2007   #5
-
0
-

Moc děkuju za pomoc, kompiloval jsem to v Dev-cpp

Nahlásit jako SPAM
IP: 89.203.136.–
tmi0
Věrný člen
25. 11. 2007   #6
-
0
-

neni zac. a ty ukazatele si trochu nastuduj, byvaji nachylne k zakernym chybam)

Nahlásit jako SPAM
IP: 89.185.230.–
ksp.mff.cuni.cz -- doporučuje 5 z 0 přetečených bufferů!
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, 126 hostů

Moderátoři diskuze

 

loadingtransparent (function() { var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true; po.src = 'https://apis.google.com/js/plusone.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s); })();
Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý