Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Ongelmia tiedostojen yhdistämisessä

dermeister [19.12.2006 20:14:10]

#

Tein ohjelman jonka olisi tarkoitus yhdistää tiedostoja siten, että
1) jos kohdetiedosto on tyhjä, kirjoitetaan tiedosto kohdetiedostoon sellaisenaan
2) jos tiedostossa on jo jotakin, kirjoitetaan lukuunottamatta lähdetiedoston ensimmäistä riviä (ei kirjoiteta ylimääräisiä otsikkorivejä).

Nyt ohjelma jostain kumman syystä lisää tiedoston vaihtuessa väliin satunnaisen merkin: numeron, välilyönnin tai rivinvaihdon. Mikä olisi vikana?

int appendFiles(FILE *tgt, FILE *src) {
   int c=0;

   /*
   Jos tiedosto on tyhjä,
   kopioidaan sellaisenaan
   */

   if ( getc(tgt) == EOF ) {
      while ( (c = getc(src)) != EOF ) {
         putc(c, tgt);
      }
   }

   /*
   Jos ei, niin luetaan eka rivi mutta
   ei tehdä sille mitään.
   Sitten kirjoitetaan kuten edellä
   */

   else {
      while ( (c = getc(src)) != '\n');
         ungetc(c, src);


      while ( (c = getc(src)) != EOF ) {
         putc(c, tgt);
      }
   }

   if ( ferror(tgt) != 0 )
      return 0;
   else
      return 1;
}

int main(int argc, char** argv) {
   int i;
   FILE *src, *tgt;

   if (argc <= 2) {
      printf("This program appends files to target file and removes\n");
      printf("additional headers (i.e. the first row) from appended files.\n");
      printf("The file names are received as command line parameters.\n");
      printf("\nUsage:\nAppFiles <target file> <source file n:o 1> [<source file n:o 2>...]\n");
      exit(EXIT_FAILURE);
   }

   tgt = fopen(argv[1], "w");
   if (tgt == NULL) {
      printf("Problems with target file. Shutting down.\n");
      exit(EXIT_FAILURE);
   }

   for (i=2; i<argc; i++) {
      src = fopen(argv[i], "r");
      if (src == NULL) {
         printf("Problems with source file %s. Shutting down.\n", argv[i]);
         exit(EXIT_FAILURE);
      }
      if (appendFiles(tgt, src) == 0) {
         printf("Problems with append process. Out of space??? Shutting down.\n");
         exit(EXIT_FAILURE);
      }
      fclose(src);
   }

   fclose(tgt);
   printf("Mission accomplished!\n");
   exit(EXIT_SUCCESS);
}

Metabolix [19.12.2006 20:31:25]

#

Mikset jatkanut edelliseen ketjuusi?!
https://www.ohjelmointiputka.net/keskustelu/13729-c-ongelma-tiedostojen-yhdistämisessä

Koko homman voisi tehdä sata kertaa paremminkin. Kirjoitan nyt suoraan laatikkoon, enkä siis testaa, mutta luultavasti kaikki toimii silti.

#include <stdio.h>
int liita(FILE *kohde, FILE *lahde)
{
    int i;
    if (!kohde || !lahde) {
        return -1;
    }
    if (ftell(kohde) > 0) { /* Jos se ei ole alussa */
        do {
            i = fgetc(lahde);
            if (i == EOF) {
                return -2; /* Vaiko nolla; tässähän se 1. rivi skipattiin. ;) */
            }
        } while (i != '\n');
    }
    i = fgetc(lahde);
    while (i != EOF) {
        if (fputc(i, kohde) == EOF) {
            return -3;
        }
        i = fgetc(lahde);
    }
    return 0;
}

Fiksu kaveri vielä lukisi freadilla ja kirjoittaisi fwritella, niin voisi saada vaikka kilon kerralla siirrettyä, mutta en nyt jaksanut näperrellä.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta