logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Błędna alokacja tablicy w C przy przetwarzaniu plików z macierzami

student_87 28 Gru 2009 10:58 1623 2
REKLAMA
  • #1 7445787
    student_87
    Poziom 10  
    Posty: 12
    Witam, pisze programik w C, który wczytuje plik tekstowy w którym zapisane są liczby w formie macierzy. Po otwarciu pliku zliczam liczbę kolumn i wierszy w pliku i później alokuję dynamicznie odpowiednią tablicę 1-wymiarową o rozmiarze kolumny*wiersze i wpisuję do niej wczytywane liczby. Założenie jest jeszcze takie, że po każdej wczytanej serii liczb (linii) jest tylko 1 enter.

    Problem polega na tym, że niektóre pliki są przetwarzane dobrze, a niektóre źle.
    Z dołączonych przeze mnie pliku, plik y2.txt jest przetwarzany dobrze, plik liczby.txt, a dla pliku piatka.txt alokowana jest zbyt duża tablica.

    Wydaje mi się, że problem jest z formatowaniem w pliku, ale nie jestem pewny.

    Proszę o pomoc i ewentualną poprawę.

    Poniżej dołączam kod programu.

    
    #include <stdio.h>
    #include <conio.h>
    #include <iostream>
    using namespace std;
    int main() {
      
      FILE *file;   //nazwa pliku 
      float *num;   //tablica liczb wczytanych z pliku
      long long int kolumny,wiersze,rozmiar;   //liczba kolumn i wierszy w pliku oraz rozmiar tablicy liczb
      char znak;                               //znak wczytywany z pliku txt
      kolumny = 0;
      wiersze = 0;
    
      //int j;
    
      file = fopen("piatka.txt", "r");
    //----------------------------------------------
    if(file)
    {
      printf("Plik otwarto pomyslnie\n");              
      
      //zliczanie kolumn w pliku
              while (znak !='\n')
              {
                  znak = getc(file);
     
                  if (isspace(znak))
                  {
                     kolumny++;
                  }
             }
             
           fseek(file,0,SEEK_SET);  //powrot do poczatku pliku
    
    //zliczanie wierszy w pliku
           while(!feof(file))
           {
                znak = getc(file);
                
                if(znak == '\n')
                   {
                        wiersze++;
                   }               
           }
           
      kolumny = kolumny+1;
      rozmiar = kolumny*wiersze;
    
      fseek(file,0,SEEK_SET);
    
      num = new float[rozmiar];
    
      //zerowanie tablicy
      for(long long int i=0; i<rozmiar; i++)
      {num[i]=0;}
    
      //----------------------------------------------
    
      long long int i=0;
      
        printf("File opened successfully.\n");
    
        while(!feof(file)) 
        { 
          fscanf(file, "%f", &num[i]);
          i++;
        }
    
        printf("Number of numbers read: %d\n\n", i);
        printf("The numbers are:\n");
    
      long long int j;
    
        for(j=0 ; j<i ; j++) 
        {      
               printf("%f\n", num[j]);
        }
        
      printf("Rozmiar: %d", rozmiar);
        fclose(file);
    
        delete []num;
        getch();
        return 0;
    }
    
    else
    {
     cout<<"Blad otwarcia"<<endl;
     fclose(file);   
    }
    }
    
    Załączniki:
    • pliki.zip (356.53 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #2 7446383
    lpm11
    Poziom 22  
    Posty: 671
    Pomógł: 48
    Ocena: 37
    I jeszcze chcesz punkty za ten załącznik ?!

    Nie chcę wnikać w ten kod, bo jest niepotrzebnie skomplikowany.
    Wiedz że na Windowsie Enter jest zapisywany w postaci dwóch znaków: \r\n.
    Na Linuxie jest tylko \n. Może w tym jest problem.

    Nie mógłbyś po ludzku tego wczytywać?
    Takie getchar, getc, fseek aż się proszą o błędy!
  • #3 7446486
    student_87
    Poziom 10  
    Posty: 12
    Co masz na myśli mówiąc "wczytywać po ludzku" ?
REKLAMA