Imam jedan gotov program (sličan tvom) koji sam nekad davno (nekome) radio,
pa ako hoćeš možeš ga malo doraditi (i ispraviti eventualne greščice):
Razlika je u tome što možeš i da odabereš redosled za spajanje.
Ovo je izlaz na ekran (sa testiranjem pogrešnih upisa):
UNOSENJE NAZIVA DATOTEKA ZA SPAJANJE:
Upisi naziv 1 datoteke (ili '#' za kraj unosa):1.txt
Upisi naziv 2 datoteke (ili '#' za kraj unosa):2.txt
Upisi naziv 3 datoteke (ili '#' za kraj unosa):nema.txt
Uneto ime datoteke ne postoji ili ne moze da se otvori!
Upisi naziv 3 datoteke (ili '#' za kraj unosa):3.txt
Upisi naziv 4 datoteke (ili '#' za kraj unosa):4.txt
Upisi naziv 5 datoteke (ili '#' za kraj unosa):5.txt
Upisi naziv 6 datoteke (ili '#' za kraj unosa):#
Upisi naziv izlazne datoteke:greska?/.txt
Uneto ime izlazne datoteke ne moze da se kreira. Probajte ponovo!
Upisi naziv izlazne datoteke:izlaz.txt
UNESTO JE 5 FAJL(OV)A ZA SPAJANJE
1 DATOTEKA: 1.txt
2 DATOTEKA: 2.txt
3 DATOTEKA: 3.txt
4 DATOTEKA: 4.txt
5 DATOTEKA: 5.txt
UNESI POZICIJU ZA SPAJANJE 1 FAJLA:5
UNESI POZICIJU ZA SPAJANJE 2 FAJLA:4
UNESI POZICIJU ZA SPAJANJE 3 FAJLA:3
UNESI POZICIJU ZA SPAJANJE 4 FAJLA:9
Pozicija je van opsega. Ponovi upis!
UNESI POZICIJU ZA SPAJANJE 4 FAJLA:8
Pozicija je van opsega. Ponovi upis!
UNESI POZICIJU ZA SPAJANJE 4 FAJLA:1
UNESI POZICIJU ZA SPAJANJE 5 FAJLA:2
A kod (sa komentarima):
Code:
#include <string.h>
#include <stdio.h>
#include <ctype.h>
#define MAX_BROJ_DATOTEKA 20
#define MAX_DUZINA_IMENA_FAJLA 100
int main( void )
{
/* naziv trenutne datoteke koju otvaramo */
char datoteka[MAX_BROJ_DATOTEKA][MAX_DUZINA_IMENA_FAJLA];
/* naziv izlazne datoteke koju otvaramo */
char izlazna[MAX_DUZINA_IMENA_FAJLA];
/* karakter preko koga ce mo kasnije kopirati*/
char ch;
/* redosled za spajanje */
int redosled[MAX_BROJ_DATOTEKA];
/* pokazivaci na datoteke */
FILE *p_datoteka[MAX_BROJ_DATOTEKA];
/* pokazivac na izlaznu datoteku */
FILE *p_izlazna;
/* inicijalizujemo broj fajlova */
int broj_fajlova=0;
/* promenljiva koju ce mo iskoristiti kao brojac*/
int i, j;
int poz;
printf( "UNOSENJE NAZIVA DATOTEKA ZA SPAJANJE:\n" );
/* dok god ne dosegnemo max broj datoteka koje smo predvideli*/
/* ako zelimo vise, samo povecamo #define inicijalizaciju */
while ( broj_fajlova < MAX_BROJ_DATOTEKA )
{
/* Unosimo naziv i-te datoteke, ili znal # za kraj unosa */
printf( "Upisi naziv %d datoteke (ili '#' za kraj unosa):", broj_fajlova+1 );
scanf( "%s", datoteka[broj_fajlova] );
/* ako smo uneli # to znaci da ne zelimo vise ni jednu datoteku */
if ( datoteka[broj_fajlova][0] == '#' ) break;
/* otvaramo i-tu datoteku */
p_datoteka[broj_fajlova] = fopen( datoteka[broj_fajlova], "r" );
/* ako je doslo do greske, vrati se na unos */
if ( p_datoteka[broj_fajlova] == NULL )
{
printf( "Uneto ime datoteke ne postoji ili ne moze da se otvori!\n" );
continue;
}
/* ako smo dosli dovde, znaci da je unos lepo prosao */
/* zatim se vrati na pocetak petlje i pitaj za unos nove datoteke */
++broj_fajlova;
}
/* ako nismo uneli ni jedan validan fajl, znaci nemamo sta ni da spajamo */
if ( broj_fajlova == 0 )
{
printf("Nije unet ni jedan fajl!\n");
/* izadji iz programa */
return;
}
/* petlja za upis izlazne datoteke */
do
{
printf( "Upisi naziv izlazne datoteke:" );
scanf( "%s", izlazna );
p_izlazna = fopen( izlazna, "w" );
/* ako je doslo do greske, na primer ako smo uneli neki nedozvoljen...*/
/* ...znak za ime fajla, vraca nas ponovo na upis */
if ( p_izlazna == NULL )
{
printf( "Uneto ime izlazne datoteke ne moze da se kreira. Probajte ponovo!\n" );
}
}
while ( p_izlazna == NULL );
printf( "\nUNESTO JE %d FAJL(OV)A ZA SPAJANJE\n", broj_fajlova );
for ( i=0; i<broj_fajlova; i++ )
printf( "%10d DATOTEKA: %s\n", i+1, datoteka[i] );
/* inicijalizovanje redosleda */
for ( i=0; i<broj_fajlova; i++ )
redosled[i] = 0;
/* unosenje redosleda */
for ( i=0; i<broj_fajlova; i++ )
{
printf( "UNESI POZICIJU ZA SPAJANJE %d FAJLA:", i+1 );
scanf( "%d", &poz );
if ( poz < 1 || poz > broj_fajlova )
{
printf("Pozicija je van opsega. Ponovi upis!\n");
--i;
continue;
}
/* provera da li je vec upisana pozicija */
for ( j=0; j<broj_fajlova; j++ )
if ( redosled[j] == poz )
{
printf("Pozicija je vec zauzeta. Ponovi upis!\n");
--i;
continue;
}
/* redosled */
redosled[i] = poz;
}
/* ovaj deo programa spaja datoteke */
for ( i=0; i<broj_fajlova; i++ )
{
while ( ( ch = fgetc( p_datoteka[ redosled[i]-1 ] ) ) != EOF )
{
fputc( ch, p_izlazna );
}
/* istovremeno zatvori i-tu otvorenu datoteke za spajanje*/
/* jer nam vise ne treba */
fclose( p_datoteka[ redosled[i]-1 ] );
}
/* zatvori izlaznu datoteku */
fclose( p_izlazna );
return ( 0 );
}