• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z zapisem do pliku pliku

Object Storage Arubacloud
0 głosów
134 wizyt
pytanie zadane 17 stycznia 2018 w C i C++ przez Tomek112 Początkujący (310 p.)

Witam, 

w poniższym kodzie chodziło mi o pobranie do tablicy dwuwymiarowej wartości charakterystycznych dla danego wektora. Zmienna liczba_el przedstawia przestrzeń w jakiej się poruszamy(ilość wymiarów). Odczytany wektor zostaje zapisany w kolejnych komórkach pierwszego wiersza tablicy wektor. Zmienna wektor2  typu double ma przechowywać w pierwszym wierszu kolejne wartości  [0,1,2,...,n-1] w zależności od przestrzeni. Zmienna wektor3 ma przechowywać zsumowane odpowiednie wiersze wektora1 i wektora2. Kolejnym krokiem jest otwarcie pliku i odczyt kolejnego wektora a następnie porównanie odczytanego wektora z wektorem3 (sumą odpowiadających współrzędnych wektorów1 i 2). W zależności czy wektor odczytany (wektor4) jest identyczny jak wektor3 jest on nadpisywany do tego pliku lub nie.

Dodam jeszcze, że kolejne linie pliku, z którego wektory są odczytywane wyglądają następująco:

Pierwszy wiersz jedna komórka z liczbą wymiarów. 

Drugi wiersz to kolejne wartości współrzędnych wektora w osobnych komórkach.

Pytanie rodzi się dlaczego program generując kolejne wartości dla wektora2 przypisywane są bardzo duże liczby (linie 42-45)? Kolejne pytanie związane z programem to dlaczego końcowe wartości nie zostają nadpisane skoro wektory (wekor3 i wektor3) się różnią.  Ostatnie pytanie czy zamiast kolejnych zmiennych i,j,k sterujących pętlami nie lepiej jest korzystać tylko z jednej (np. i) a po wykonaniu pętli ją zerować, żeby móc wykorzystać ponownie?

Kod przedstawia się następująco:

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

double compare(int ilosc_wsp,double *tab[1][ilosc_wsp], double *tab2[1][ilosc_wsp]){
    int l=0,compatible=1;
    for(l;l<=ilosc_wsp;l++){
        if(tab[1][l]==tab2[1][l]){

        }else{
            compatible=0;
            return 0;
        }
    }
    if(compatible==1){
        return 1;
    }else{
    return 0;
    }
};

int main()
{
   FILE *plik,*plik2;
   int liczba_el,i=0,j=0,k=0;
   plik=fopen("vec_in.csv","r");
   if(plik==NULL){
    printf("Blad otwarcia pliku.\n");
    exit(1);
   }else{
        printf("Plik zrodlowy zostal otwarty.\nWartosci pobranego wektora: \n");
            fscanf(plik,"%d",&liczba_el);
            double wektor[1][liczba_el];
            for(i;i<=liczba_el;i++){
                fscanf(plik,"%d",&wektor[1][i]);
                printf("%d \t",wektor[1][i]);
            }
            printf("\n");
        fclose(plik);

        double wektor2[1][liczba_el],wektor3[1][liczba_el],wektor4[1][liczba_el];
        printf("Wartosci utworzonego wektora: \n");
        for(j;j<=liczba_el;j++){
        wektor2[1][j]=j;
        printf("%d\t",wektor3[1][j]);
        }
        printf("\nWartosci po dodaniu wektorow:\n");
        for(k;k<=liczba_el;k++){
            wektor3[1][k]=wektor2[1][k]+wektor[1][k];
            printf("%d\t",wektor3[1][k]);
        }
        printf("\n");
        plik2=fopen("vec_sum.csv","r+");
        if(plik2==NULL){
            printf("Blad otwarcia pliku porownawczego.\n");
            exit(1);
       }else{
           printf("Otworzono plik porownawczy.\nWektor z pliku porownawczego:\n");
           i=0;
           //nie wiem czy ma być
           fscanf(plik,"%d",&liczba_el);
           for(i;i<=liczba_el;i++){
                fscanf(plik2,"%d",&wektor4[1][i]);
                printf("%d \t",wektor4[1][i]);
            }
            i=0;
            printf("\n");
            //tworzenie wskaznikow
            double *wek1,*wek2;
            wek1=&wektor3[1][0];
            wek2=&wektor4[1][0];
            //wykorzystanie funkcji compare
            if(compare(liczba_el,wek1,wek2)){
                printf("Podane wektory sa takie same.\n");
            }else{
                printf("Podane wektory sa rozne.\nWektor zostal nadpisany.\n");
                fprintf(plik2,"%d\n",liczba_el);
                for(i;i<=liczba_el;i++){
                    fprintf(plik2,"%d ",wektor3[1][i]);
                }
            };
            fclose(plik2);

       }

   }


    return 0;
}

 

2 odpowiedzi

0 głosów
odpowiedź 17 stycznia 2018 przez Tomek112 Początkujący (310 p.)
Do podanego zadania wystarczyły tablice jednowymiarowe. Bardzo długie liczby jakie były przydzielanie związane były z typem kodowania ponieważ jeden plik miałem w formacie ANSI a drugi w formacie UTF-8. Dodatkowo w pętlach warunek został zmieniony z <= na <. Natomiast co z tymi zmiennymi sterującymi pętlą?
0 głosów
odpowiedź 17 stycznia 2018 przez j23 Mędrzec (194,920 p.)
double wektor2[1][liczba_el], wektor3[1][liczba_el], wektor4[1][liczba_el];
printf("Wartosci utworzonego wektora: \n");

for(j;j< = liczba_el;j++)
{
        wektor2[1][j] = j;
        printf("%d\t",wektor3[1][j]);
}

Po co te dwa wymiary, jeśli w praktyce masz jeden? Indeksowanie masz schrzanione - j jest niewyzerowane, a pierwszy wymiar indeksujesz poza zakresem (w C/C++ indeksuje się od zera!). Reszta pętli to samo...

Podobne pytania

0 głosów
2 odpowiedzi 456 wizyt
0 głosów
0 odpowiedzi 91 wizyt
0 głosów
1 odpowiedź 1,210 wizyt

92,568 zapytań

141,420 odpowiedzi

319,622 komentarzy

61,954 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...