Tein funktion, joka joko kopioi lähdetiedoston kohdetiedostoon tai yhdistää lähdetiedoston sen perään siten, että
1) jos kohdetiedosto on tyhjä, lähdetiedoston sisältö lisätään sellaisenaan
2) jos kohdetiedostossa on jotakin, lisätään lähdetiedosto kohteen perään lukuunottamatta 1.riviä
Esimerkki-lähdetiedosto voisi olla:
id avg std perc1 perc2 ... 1 35 5 2 4 6 ... ...
eli turhat otsikkorivit jätetään lisäämättä.
Nyt yhdistettäessä jokaiseen tiedoston vaihtumiskohtaan, ensimmäisen kohdetiedostoon kirjoitettavan uuden rivin alkuun tulee satunnainen merkki (jokin numero, välilyönti tai rivinvaihto). Mistä tämä voisi johtua?
Alla kirjoittamani funktio:
int appendFiles(FILE *tgt, FILE *src) { int c; /* Jos tgt on tyhjä, kopioidaan sellaisenaan... */ if ( getc(tgt) == EOF ) { while ( (c = getc(src)) != EOF ) { putc(c, tgt); } } /* ... muuten luetaan otsikkorivi ekassa while silmukassa mutta ei kirjoiteta sitä */ else { while ( (c = getc(src)) != '\n'); while ( (c = getc(src)) != EOF ) { putc(c, tgt); } } if ( ferror(tgt) != 0 ) return 0; else return 1; }
Tuo satunnainen merkki voisi viitata siihen, että et ole nollannut muuttujaa funktion alussa. Auttaisiko vaihtaa rivi
int c;
muotoon
int c=0;
Olet juuri "lukenut" kohdetiedostosta yhden merkin, voisiko se vaikuttaa asiaan? Pitäisikö ehkä lisätä ungetc, jos se merkin lukeminen onnistui?
if ((c = fgetc(tgt)) != EOF) { ungetc(c, tgt); do { c = fgetc(src); } while (c != '\n' && c != EOF); } while ((c = fgetc(src)) != EOF) { fputc(c, tgt); }
Aihe on jo aika vanha, joten et voi enää vastata siihen.