Mieszanie pliku tekstowego po x lini

0

Witam
Mógłby mi ktoś podpowiedzieć co robię źle ?
Założeniem było napisanie program który będzie mieszał plik tekstowy np biorąc po trzy linie

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>

#define BUFSIZE 8000
#define MAX_LINE 10000

int main(int argc, char **argv){
    
    int    i, j, j2;
    char    buf[BUFSIZE];
    char    *tab_napisow [MAX_LINE];
    FILE    *in = argc > 1 ? fopen(argv[1], "r") : stdin ;
    int     x = argc > 2 ? atoi(argv[2]) : 3;
    int     los, wykonane_petle, ilosc_przedzialow;
    char    tmp[BUFSIZE];

    if (in == NULL) 
        printf("Nie moge odczytac pliku");
    else {
        i = 0;
        while (fgets(buf, BUFSIZE, in) != NULL) {
            if (i < MAX_LINE) {
                if (( tab_napisow[i] = malloc ((strlen(buf) + 1 ) * sizeof( char ) )) == NULL ) {
                    fprintf(stderr, "blad przydzielania pamieci \n");
                    return EXIT_FAILURE;
                }
                strcpy(tab_napisow[i], buf);
                i++;
            }
            else {
                fprintf( stderr, "blad - zbyt wiele lini wejscia");
                return EXIT_FAILURE;
            }

        }
        fclose(in);
        for (j = 0; j<i; j++)
            printf("%s",tab_napisow[j]);

        srand(time(NULL));
        ilosc_przedzialow = (i + 1) / x;
        wykonane_petle = 1;

        for (j = 0; j < (ilosc_przedzialow - 1); j++) {
            los =wykonane_petle + rand() % ( ilosc_przedzialow - 1);
            for (j2 = 0; j2 < x; j2++) {
                strcpy(tmp, tab_napisow[j * x + j2]);
                strcpy(tab_napisow[j * x + j2], tab_napisow[los * x + j2]);
                strcpy(tab_napisow[los * x + j2], tmp);
            }
            wykonane_petle++;
        }
            

    }
return EXIT_SUCCESS;    
}
1
  1. Źle liczysz ilość przedziałów (sprawdź dla 4 i dla 5)
  2. tab_napisow[i] jest wskaźnikiem, więc możesz wymienić z innym bez kopiowania napisu
  3. Zacznij korzystać z funkcji np tu się przyda: void check(int Err,const char *msg) { if(!Err) return; fprintf(stderr,msg); exit(EXIT_FAILURE); } oraz inne
  4. Zauważ że do jednej tablicy char buf[BUFSIZE]; możesz wpisać więcej niż jeden wiersz, później prościej mieszać.
0

Takie obliczanie ilości przedziałów jest akurat celowe ponieważ chce mieszacz zawsze po np 3 linie wiec jeśli będzie się dzielić z resztą to porostu ostatnie linie zostaną nie zmienione.
Miałem również błąd w losowaniu.

Dzięki wielkie za pomoc

0

No to nadal masz źle, dla 5-ciu wierszy masz 2 przedziały.

0
ilosc_przedzialow = (i + 1) / x;

jeśli mam 5 wierszy i = 4 ponieważ liczone jest od 0
zakładamy że x = 3
z tego co wiem to / obcina końcówkę w każdym przypadku a nie zaokrągla
wiec (4+1) / 3 = 1
Gdzieś coś źle rozumiem ?

1
Sc00rpion napisał(a):

jeśli mam 5 wierszy i = 4 ponieważ liczone jest od 0
...

Sc00rpion napisał(a):

Gdzieś coś źle rozumiem ?

Tak. Po wczytaniu każdego wiersza zwiększasz i czyli dla 5-ciu wierszy i=5;

0

Racja
Dzięki za poprawienie

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