Načtení ze souboru a následné zapsání s obracenými hodnotami – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Načtení ze souboru a následné zapsání s obracenými hodnotami – C / C++ – Fórum – Programujte.comNačtení ze souboru a následné zapsání s obracenými hodnotami – C / C++ – Fórum – Programujte.com

 

Spacek
~ Anonymní uživatel
3 příspěvky
12. 1. 2015   #1
-
0
-

Zdravim,

Potřebuju načíst postupně do tří polí tři věty(a,b,c) ze souboru, takže v každém poli bude jedna věta. Tyto věty následně obrátím(c,a,b) a zapíšu zpět do souboru. Úkol musí být řešen pomocí ukazatelů. Zdrojový kód, co jsem doposud stvořil sem příkládám, prosím vás o rady co je špatně. Děkuju.

Zdrojový kód:

char pole1[9];
    char pole2[9];
    char pole3[9];
    int i;
    char *p;
    char *q;
    char *r;
    p=pole1;
    q=pole2;
    r=pole3;
    FILE *fr;
    FILE *fw;
    
    if((fr = fopen("text.txt","r")) == NULL) { /* test otevření souboru pro čtení*/
       printf("Soubor se nepodarilo otevrit.\n");
       return 1;
    }
    
    for(i = 0; i < 9; i++) { 
        fscanf(fr,"%c", &p[i]); 
    }
    
    for(i = 0; i < 9; i++) { 
        printf("%c", p[i]);
    }
    
    for(i = 10; i < 20; i++) {
        fscanf(fr,"%c", &q[i]);
    }
    
    for(i = 10; i < 20; i++) {
       printf("%c", q[i]);
    }
    
    for(i = 21; i < 31; i++){
        fscanf(fr,"%c", &r[i]);
    }
    
    for(i = 21; i < 31; i++){
        printf("%c", r[i]);
    }
    
    if(fclose(fr) == EOF) {  /* test zavření souboru pro čtení*/ 
       printf("Soubor se nepodarilo zavrit.\n");
       return 1;
    }
    
    if((fw = fopen("text.txt","a")) == NULL) { /* test otevření souboru pro zápis */
       printf("Soubor se nepodarilo otevrit.\n");
       return 1;
    }
    
    for(i = 21; i < 31; i++){
      fprintf(fw, "%c", r[i]);
    }
    
    for(i = 0; i < 9; i++){
      fprintf(fw, "%c", p[i]);
    }
    
    for(i = 10; i < 20; i++){
      fprintf(fw, "%c", q[i]);
    }
    
    if(fclose(fw) == EOF) { /* testování zavření souboru pro zápis*/ 
      printf("Soubor se nepodarilo zavrit.\n");
      return 1;
 }

Nahlásit jako SPAM
IP: 93.99.130.–
Spacek
~ Anonymní uživatel
3 příspěvky
12. 1. 2015   #2
-
0
-

Doplňění: Takto zapsaný zdrojový kód způsobí, že se postupně věty jedna po druhé zapíšou do jednotlivých polí, problém je v zapsání zpátky do souboru, kde se napíšou nesmyslné znaky - zavináče, závorky atd.

Nahlásit jako SPAM
IP: 93.99.130.–
voty+1
Návštěvník
12. 1. 2015   #3
-
0
-

Osobně bych se zaměřil na to, co se tak asi stane, když do pole, které má velikost 9 znaků, zapíšeš na 10. až 19. pozici. To děláš v při načítání do pole q[]. Podobně do pole r[] ukládáš na pozice, které jsou dávno za jeho hranicí.

Nahlásit jako SPAM
IP: 88.100.230.–
Jednu rozbil a tu druhou ztratil.
Spacek
~ Anonymní uživatel
3 příspěvky
12. 1. 2015   #4
-
0
-

#3 voty
Aha, díky. Nějak jsem se minul a přesně jsem si nedokázal odůvodnit, proč do cyklu dávám přesně tato čísla, každopádně pole mají 9 míst, protože mám věty: vetaprvni; vetadruha; vetatreti, a nebyl jsem si presne jist, jak je to tam s těma nulovýma znakama. Zápis i < 9 by znamenal, že se zapíše 0-8, což by stačilo pouze na obsah vět, ale co ten nulový znak? Nemělo by tam být spíš i < 10? 

Nahlásit jako SPAM
IP: 93.99.130.–
q
~ Anonymní uživatel
219 příspěvků
12. 1. 2015   #5
-
0
-

Máš načítat věty a ne konstantní počet znaků.

Pravděpodobně je to textový soubor a na každém řádku je jedna věta, takže budeš číst všechny znaky až do konce řádku (a dokud máš v poli místo) a nulovým znakem si to budeš ukončovat sám (pokud to potřebuješ). Už na to existují funkce, např. fgets.

Nahlásit jako SPAM
IP: 213.211.51.–
voty+1
Návštěvník
13. 1. 2015   #6
-
0
-

#4 Spacek
Tak ono dost záleží na tom, jak jsou definovány "věty" ve vstupním souboru. Zda-li je to pevný počet znaků (jak to máš udělané teď), nebo zda je to proměnný počet znaků, jak to naznačuje Q, nebo ještě úplně jinak. Například čím jsou od sebe jednotlivé věty odděleny?

Pokud by byly věty definovány jako pevný počet znaků, není až tak úplně nutné ukončovat pole nulovým znakem '\0', neboť víš, že délka je pevná. Nicméně v jazyce C bývá dobrým zvykem pohlížet na pole charů jako na řetězec a ten znakem '\0' ukončovat, neboť pak můžeš v programu použít další knihovní funkce pro práci s řetězci.

Nahlásit jako SPAM
IP: 81.19.46.–
Jednu rozbil a tu druhou ztratil.
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, 7 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ý