[ del-boy @ 22.01.2006. 22:26 ] @
Treba da napišem jedan dosta jednostavan program, ali naišao sam na neke poteškoće!

Proigram treba da otvori datoteku (textualnu) i da iza svakog reda doda još jedan isti takav red!

Napisao sam kod, ali ne radi kako treba. U stvari ništa ne uradi.
Kod je:
Code:

while (fgets(out, 100, dat)!=NULL) {
    fprintf(dat, "%s", out);
}


Ne znam u čemu grešim. Pokušao sam i funkcijom fputs umesto fprintf, ali opet isto!

Ne treba mi gotovo rešenje, trebaju mi samo uputstva!

Dosta je hitno, pa ako neko može da pomogle!

Hvala unapred...

[ Pharos @ 22.01.2006. 23:11 ] @
A da ti nama lepo okačiš ceo kod pa da gledamo gde je problem?
Kako si otvarao fajl itd.
[ NrmMyth @ 22.01.2006. 23:36 ] @
Evo ti upustvo, ucitaj u memoriju cijeli faj pa ga ponovno ispisi.
Ovdje ti radis neki krosing, 100% ces dobiti gluposti.
[ vaske71 @ 23.01.2006. 00:05 ] @
okaci ceo kod covece , jer ovo sto si dao nije potpuno
[ del-boy @ 23.01.2006. 00:09 ] @
Evo celog koda!
Code:

#include <stdio.h>

main (int brArg, char *Arg[]) {

        /*deklaracija promenljivih*/
    FILE *dat;
    int zn;
    char out[100], fajl[30], file2[31];
    
        /*brisanje ekrana*/
    clrscr();
    
    

printf("\n\tProgram za dupliranje redova u zadatom textualnom fajlu!\n");
printf("\tZa ime fajla je potrebno uneti samo ime ukoliko se ovaj program 
nalazi\n\t\tu istom direktorijumu kao i fajl. U suprotnom je potrebno 
uneti\n\t\tkompletnu apsolutnu adresu (primer: c:\\dir\\dajl.txt)!\n\n");


/*odredjivanje imena fajla*/
if (brArg == 1) {
    printf("Unesite ime fajla za dupliranje redova: ");
    scanf("%s", fajl);
}
    else strcpy(fajl, Arg[1]);
    

    /*otvaranje fajla*/
    if ((dat = fopen(fajl, "a+") == NULL)) {
    printf("\n\tGRESKA! Fajl nije otvroren! Proverite da li ste uneli dobro ime!\n\n");
    exit(1);

        /*kreiranje duplih redova*/
    while (fgets(out, 100, dat)!=NULL) {
        printf("%s", out);
        fprintf(dat, "%s", out);
    }

        /*zatvaranje fajla*/
    fclose(dat);

    printf("\n\n\n***KRAJ PROGRAMA***\n\n\n");

getch();
return 0;


}




Nisam ga stavio jer mi se čini da ostatak radi kako treba! Otvori fajl normalno, i ispiše ga na ekranu!


[Ovu poruku je menjao del-boy dana 23.01.2006. u 01:13 GMT+1]
[ Goran Arandjelovic @ 23.01.2006. 02:14 ] @
Citat:
NrmMyth: Evo ti upustvo, ucitaj u memoriju cijeli faj pa ga ponovno ispisi.
Ovdje ti radis neki krosing, 100% ces dobiti gluposti.


A zašto tako? Šta fali ako ima dva deskriptora paralelno otvorena gde će iz jednog čitati, a drugi dva puta pisati?
[ DarkMan @ 23.01.2006. 12:58 ] @
Code:

    while (fgets(out, 100, dat)!=NULL) {
        printf("%s", out);
        fprintf(dat, "%s", out);
    }

Ovako ne moze. Trenutno mogu da nagdjam sta se desava kada procitas jedan red pa pokusas da upises isti takav. Vidim da si fajl otvorio sa "a+" sto znaci da se sve upisuje na kraj fajla sto, koliko mi se cini, nisi hteo.

Moraces da otvoris taj tvoj fajl u modu za citanje i otvoris novi za upis i u njega po dvaput upises to sto procitas iz prvog (kao sto ti je Goran vec rekao). Posle toga mozes jednostavno da izbrises prvi i preimenujes drugi.

Code:

FILE *fin = fopen("in.txt", "r");
FILE *fout = fopen("out.txt", "w");
char buffer[255];
    while (fgets(buffer, 255, fin)!=NULL) {
        fputs(buffer, fout);
        fputs(buffer, fout);
    }
fclose(fout);
fclose(fin);

remove("in.txt");
rename("out.txt", "in.txt");


[Ovu poruku je menjao DarkMan dana 23.01.2006. u 14:01 GMT+1]
[ Pharos @ 23.01.2006. 13:26 ] @
Upravo tako.
Plus što imaš još dosta greškica u kodu.
Radiš sa stringovima, a nemaš
Code:

#include <string.h>


Zatim

Code:

printf("\n\tProgram za dupliranje redova u zadatom textualnom fajlu!\n");
printf("\tZa ime fajla je potrebno uneti samo ime ukoliko se ovaj program 
nalazi\n\t\tu istom direktorijumu kao i fajl. U suprotnom je potrebno 
uneti\n\t\tkompletnu apsolutnu adresu (primer: c:\\dir\\dajl.txt)!\n\n");


ne može tako da se piše već

Code:

printf("\n\tProgram za dupliranje redova u zadatom textualnom fajlu!\n");
printf("\tZa ime fajla je potrebno uneti samo ime ukoliko se ovaj program" 
"nalazi\n\t\tu istom direktorijumu kao i fajl. U suprotnom je potrebno" 
"uneti\n\t\tkompletnu apsolutnu adresu (primer: c:\\dir\\dajl.txt)!\n\n");


Nedostaje ti par navodnika.
Neke promenljive ti ostaju neiskorišćene...

Pošto vidim da si na vindozi, zameni clrscr(); sa system("CLS");

[Ovu poruku je menjao Pharos dana 23.01.2006. u 14:38 GMT+1]
[ del-boy @ 23.01.2006. 16:00 ] @
OK hvala, pokušaću sa dva fajla!

@Pharos
Nisam ubacio string.h jer mi je ovako radilo sve! Verovatno ga kompajler sam ubaci kad vidi da je potreban!

Što se tiče ovog ispisa znam i za to, ali meni u koju je to sve u jednom redu. Ovde sam lupio par entera da ne bih bespotrebno širio poruku!

ovo za clrscr() nisam znao! Kod mene na Turbo C-u ovo lepo radi, ali probaću sa ovim tvojim kodom!



Hvala svima još jednom! Ako negde zapnem jeviću se opet...

[ NrmMyth @ 23.01.2006. 18:13 ] @
Mozda grijesim, no nije li tocno da prilikom upisivanja u datoteku se izvrsava overwrite.
Ako je to tocno (sto cu provjeriti), onda nikako sa onom petljom ne moze ucitati i zatim istovremeno "ubaciti dva reda", a da ne izgubi nesto sta bi se trebalo ucitati sljedecom iteracijom.