tablica wskaźników do struktury FILE

0
 #include <stdio.h>
#include <stdlib.h>
void filecomp(FILE *fp1, FILE *fp2)
{
    int c;
    while((c = getc(fp1)) == getc(fp2) && c != EOF)
        ;
    if(c != EOF)//byly roznice
    {
        putc(c, fp1);
    }
}
int main(void)
{
    FILE *fp[2];
    char *tab[] = {
                   "nazwa1.txt",
                   "nazwa2.txt"
                  };
                if((*fp = fopen(*tab, "r")) == NULL)
                {
                    //printf("%s\n", *tab);
                    exit(1);
                }
            if((*(fp + 1) = fopen(*(tab+1), "r")) == NULL)
                {
                    exit(2);
                }
            filecomp(*fp, *(fp+1));
            fclose(*fp);
            fclose(fp+1);
    return 0;
}

Jak zawsze problem ze wskaznikami, fopen zwraca NULL, co robię nie właściwie ?
Program ma za zadanie porownywac dwa pliki i wypisywac pierwszy wiersz ktory nie jest identyczny

 #include <stdio.h>
#include <stdlib.h>
void filecomp(FILE *fp1, FILE *fp2)
{
    int c;
    while((c = getc(fp1)) == getc(fp2) && c != EOF)
        ;
    if(c != EOF)//byly roznice
    {
            putc(c, stdout);
        while((c = getc(fp1))!= EOF)
            putc(c, stdout);
    }
}
int main(void)
{
    FILE *fp[2];
    char *tab[] = {
                   "zzzz.txt",
                   "yyyy.txt"
                  };
                if((*fp = fopen(*tab, "r")) == NULL)
                {
                    exit(1);
                }
            if((*(fp + 1) = fopen(*(tab+1), "r")) == NULL)
                {
                    exit(2);
                }
            filecomp(*fp, *(fp+1));
            fclose(*fp);
            fclose(*(fp+1));
    return 0;
}

wyniki poprawne, chyba udalo sie poprawic

0

Skoro już zrobiłeś tablice to korzystaj z tego

int main()
  {
   const char *tab[]={ "zzzz.txt", "yyyy.txt" };
   FILE *fp[2];
   int i;
   for(i=0;i<2;++i) if(!(fp[i]=fopen(tab[i],"r"))) exit(i+1);
   filecomp(fp[0],fp[1]);
   for(i=0;i<2;++i)  fclose(fp[i]);
   return 0;
  }
0

Ja bym nieco zmienił funkcję porównującą:

int filecomp(FILE *fp1, FILE *fp2)
{
    int c1, c2;
    /* Zabezpiecza przed porownanie z samym soba.
     Nie da się porownac pliku z samymy soba ponizszym algorytmem. */
    if(fp1 == fp2) return 1;//takie same

    //na wypadek gdyby jeden z plikow byl porownywany wczesniej
    fseek(fp1, 0, SEEK_SET);
    fseek(fp2, 0, SEEK_SET);
    do
    {
        c1 = getc(fp1);
        c2 = getc(fp2);
    } while(c1 == c2 && c1 != EOF);

    return (c1 == c2);
} 

Zwraca 1 gdy takie same i 0 gdy różne. Odbiega to od funkcji ze standardowej bibliteki C.

1 użytkowników online, w tym zalogowanych: 0, gości: 1