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

Jak odczytać liczby z pliku rafal.txt do tablicy w C?

Chivo 07 Mar 2006 20:18 1734 11
REKLAMA
  • #1 2387067
    Chivo
    Poziom 27  
    Posty: 1326
    Pomógł: 81
    Ocena: 130
    W pliku tekstowym rafal.txt sa liczby ale nie wiadomo ile dokladnie.Program ma otworzyc ten plik i zapisac liczby w tablicy pomiary tak zeby mozna bylo operowac na tych liczbach ale odczytanych juz z tej tablicy.Napisalem taki program ale on nie dziala, nie chce nawet wypusac zawartosci pliku rafal.txt.

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

    int main(void)
    {
    int i;
    int ilosc;
    int pomiary[1000];
    FILE *dane;

    dane=fopen("R:\RAFAL.txt","rt");
    fprintf(dane,"\n");
    /*fscanf(dane,"%d",&ilosc);
    for(i=0;i<ilosc;i++)
    fscanf(dane,"%d",&pomiary[i]);
    fclose(dane); */

    getch();
    return 0;
    }


    Dziekuje za pomoc
  • REKLAMA
  • REKLAMA
  • #3 2390854
    krzkomar
    Poziom 25  
    Posty: 877
    Pomógł: 71
    Ocena: 25
    Ja tu czegoś nie rozumiem, co to jest "rt" ???? chyba miało być "r+" - otwarcie pliku na zapis/odczyt. Na dodatek na poczatku piszesz fprintf(dane,"\n") - to spowoduje skasowanie pliku i zapisanie do niego znaku końca linii, kolejne skanfy (jesli je odkomentujesz nic nie przeczytają z pliku).
  • #4 2396177
    asterix17td
    Poziom 17  
    Posty: 163
    Pomógł: 17
    Ocena: 18
    Z tego co pamietam z C to przy podawaniu ścieżki do pliku zamiast
    ....R:\RAFAL.txt....... napisz R:\\RAFAL.txt (dwa ukośniki), ponieważ C pierwszy ukośnik ( \ ) traktuje jako zapowiedź znaku specjalnego np. \n.
    Pozdr

    Dodano po 5 [minuty]:

    Dodałbym też na początku: #include <iostream.h>
  • #5 2396278
    krzkomar
    Poziom 25  
    Posty: 877
    Pomógł: 71
    Ocena: 25
    asterix17td napisał:

    Dodałbym też na początku: #include <iostream.h>


    to jest w C a nie w C++
  • REKLAMA
  • #6 2397026
    one_eddie
    Poziom 25  
    Posty: 973
    Pomógł: 62
    Ocena: 14
    Chivo: pamiejat o znacznikach CODE.
    Prawidlowa wersja programu wyglada tak:

    #include<stdio.h>
    #include<stdlib.h>
    
    int main(void)
    {
      FILE* dane = fopen( "R:/RAFAL.txt", "rt" );
      if ( !dane )
        return 1;
    
      int ilosc;
      fscanf( dane, "%d", &ilosc );
    
      int i;
      int* pomiary = (int*)malloc( ilosc * sizeof( int ) );
      for( i=0; ( i<ilosc ) && !feof( dane ); i++)
        fscanf( dane, "%d", &pomiary[ i ] );
    
      // cos wypada z tymi pomiarami zrobic
    
      fclose(dane);
      free( pomiary );
      getch();
      return 0;
    }


    W kodzie bylo kilka bledow wiekszosc wytknely ci osoby postujace wyzej.
  • #7 2397123
    krzkomar
    Poziom 25  
    Posty: 877
    Pomógł: 71
    Ocena: 25
    Jesli piszemy w C to nie ma racji bytu zapis "delete[] pomiary" ! Powinno być "free(pomiary)"
  • #8 2397142
    one_eddie
    Poziom 25  
    Posty: 973
    Pomógł: 62
    Ocena: 14
    krzkomar napisał:
    Jesli piszemy w C to nie ma racji bytu zapis "delete[] pomiary" ! Powinno być "free(pomiary)"


    Tak przepraszam. Straszna wpadka :D

    Powinno byc :
    free( pomiary )


    Za duzo siedze w C++.
  • #9 2398281
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 241
    krzkomar napisał:
    Ja tu czegoś nie rozumiem, co to jest "rt" ???? chyba miało być "r+" - otwarcie pliku na zapis/odczyt.
    RT to chyba odczyt w trybie binarnym.
  • #10 2398295
    one_eddie
    Poziom 25  
    Posty: 973
    Pomógł: 62
    Ocena: 14
    elektryk napisał:
    krzkomar napisał:
    Ja tu czegoś nie rozumiem, co to jest "rt" ???? chyba miało być "r+" - otwarcie pliku na zapis/odczyt.
    RT to chyba odczyt w trybie binarnym.


    Pomijam plusy ale reszta tak jak pokaze nizej:
    r- read
    w - write
    t - text
    b - binary

    Zreszta odsylam do: http://cplusplus.com/ref/cstdio/fopen.html
  • REKLAMA
  • #11 2398495
    krzkomar
    Poziom 25  
    Posty: 877
    Pomógł: 71
    Ocena: 25
    No to już mogą być różnice między platformami (ja używam linuksa), bądź różnica między wersją funkcji dla C i C++, ja u siebie w systemie mam:
    
           FILE *fopen(const char *path, const char *mode);
           FILE *fdopen(int fildes, const char *mode);
           FILE *freopen(const char *path, const char *mode, FILE *stream);
    
    OPIS
           Funkcja  fopen  otwiera plik, którego nazwę wskazuje path i wiąże z nim
           strumień.
    
           Argument  mode  wskazuje  na  łańcuch  rozpoczynający  się   jednym   z
           poniższych ciągów (mogą po nich występować dodatkowe znaki):
    
           r      Otwarcie pliku tekstowego do odczytu. Strumień wskazuje początek
                  pliku.
    
           r+     Otwarcie pliku do odczytu i zapisu. Strumień  wskazuje  początek
                  pliku.
    
           w      Usunięcie  zawartości  pliku  lub  utworzenie  nowego pliku tek-
                  stowego do zapisu.  Strumień wskazuje początek pliku.
    
           w+     Otwarcie do odczytu i zapisu. Jeśli plik nie  istnieje,  zostaje
                  utworzony, w przeciwnym wypadku jego zawartość zostaje usunięta.
                  Strumień wskazuje początek pliku.
    
           a      Otwarcie do dopisywania (zapisu na końcu pliku). Jeśli plik  nie
                  istnieje,  zostaje utworzony. Strumień wskazuje na koniec pliku.
    
           a+     Otwarcie do odczytu i dopisywania (zapisu na końcu pliku). Jeśli
                  plik  nie  istnieje,  zostaje  utworzony.  Strumień  wskazuje na
                  koniec pliku.
    
           Łańcuch mode może także zawierać literę ``b'' zarówno jak ostatni  znak
           jak  też  jako  znak umeszczony pomiędzy znakami dowolnego dwuznakowego
           łańcucha opisanego  powyżej.   Służy  to  wyłącznie  zgodności  z  ANSI
           X3.159-1989  (``ANSI  C'')  i  nie  powoduje żadnego efektu, ``b'' jest
           ignorowane we wszystkich systemach zgodnych z POSIX, włączając Linuksa.
    
    

    Stąd moje zdziwienie
  • #12 2412610
    Chivo
    Poziom 27  
    Posty: 1326
    Pomógł: 81
    Ocena: 130
    Dzieki za pomoc program juz prawie skonczylem nie wiem tylko jak w piatym punkcie policzyc histogram danych.
    Oto ten program:
    #include<conio.h>
    #include<stdio.h>
    #include<stdlib.h>
    #include<math.h>

    int main(void)
    {
    int i;
    int j;
    float suma;
    float suma1;
    float srednia;
    float wariancja;
    float odchylenie;
    int wybor;
    int pomiary[304];
    int tablica[304];
    FILE *dane;

    clrscr();
    i=0;
    suma=0;
    suma1=0;


    dane=fopen("R:/rafal.txt", "r+b");
    while (!feof(dane))
    {
    fscanf(dane,"%d",&pomiary[i]);
    i++;
    }
    fclose(dane);

    printf(" Akwizycja i wstepne opracowanie sygnalow bioelektrycznych \n\n\n\n\n\n\n\n");
    printf("1.Rejestracja sygnalu HRV\n\n");
    printf("2.Wartosc srednia czestosci rytmu pracy serca\n\n");
    printf("3.Wariancja czestosci rytmu pracy serca\n\n");
    printf("4.Wartosc odchylenia standardowego czestosci rytmu pracy serca\n\n");
    printf("5.Histogram czestosci rytmu pracy serca\n\n");
    scanf("%d",&wybor);

    if(wybor==1)
    {
    printf("Oto dane odczytane z pliku:\n\n");
    for(j=0;j<i;j++)
    {
    printf("%d\t",pomiary[j]);
    }
    }


    if(wybor==2)
    {
    for(j=0;j<i;j++)
    {
    suma=suma+60000/pomiary[j];
    }
    srednia=suma/i;
    printf("\nWartosc srednia czestosci rytmu pracy serca wynosi (uderzen/min): %3.3f",srednia);
    }


    if(wybor==3)
    {
    for(j=0;j<i;j++)
    {
    suma=suma+60000/pomiary[j];
    }
    srednia=suma/i;
    for(j=0;j<i;j++)
    {
    tablica[j]=(60000/pomiary[j]-srednia)*(60000/pomiary[j]-srednia);
    }
    for(j=0;j<i;j++)
    {
    suma1=suma1+tablica[j];
    }
    wariancja=suma1/i;
    printf("Wariancja czestosci rytmu pracy serca wynosi: %3.3f",wariancja);
    }


    if(wybor==4)
    {
    for(j=0;j<i;j++)
    {
    suma=suma+60000/pomiary[j];
    }
    srednia=suma/i;
    for(j=0;j<i;j++)
    {
    tablica[j]=(60000/pomiary[j]-srednia)*(60000/pomiary[j]-srednia);
    }
    for(j=0;j<i;j++)
    {
    suma1=suma1+tablica[j];
    }
    wariancja=suma1/i;
    odchylenie=sqrt(wariancja);
    printf("Wartosc odchylenia standardowego czestosci rytmu pracy serca wynosi: %3.3f",odchylenie);
    }


    if(wybor==5)
    {
    for(j=0;j<i;j++)
    {
    suma=suma+60000/pomiary[j];
    }
    srednia=suma/i;
    for(j=0;j<i;j++)
    {
    tablica[j]=(60000/pomiary[j]-srednia)*(60000/pomiary[j]-srednia);
    }
    for(j=0;j<i;j++)
    {
    printf("%d\t",tablica[j]);
    }
    }


    getch();
    return 0;

    }

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy problemu odczytu nieznanej liczby wartości całkowitych z pliku tekstowego "rafal.txt" do tablicy w języku C. Autor programu miał trudności z poprawnym otwarciem pliku i wczytaniem danych, m.in. z powodu błędów w ścieżce pliku (użycie pojedynczego ukośnika zamiast podwójnego), nieprawidłowego trybu otwarcia pliku ("rt" jest poprawnym trybem do odczytu tekstowego, a "r+" do odczytu i zapisu), oraz błędnego użycia funkcji fprintf do zapisu do pliku otwartego do odczytu. Wskazano, że do odczytu znaków nie należy używać fgetc do wczytywania liczb całkowitych, lecz fscanf z odpowiednim formatem. Zaproponowano dynamiczne alokowanie pamięci na podstawie liczby odczytanej z pliku lub wczytywanie danych w pętli do tablicy statycznej, z uwzględnieniem warunku końca pliku. Podkreślono konieczność poprawnego zamknięcia pliku i zwolnienia pamięci. W dalszej części autor pytał o sposób obliczenia histogramu na podstawie wczytanych danych, prezentując fragment programu z funkcjami statystycznymi (średnia, wariancja, odchylenie standardowe) i menu wyboru operacji. Dyskusja zawierała także wyjaśnienia dotyczące trybów otwarcia pliku w C, różnic między trybami tekstowymi i binarnymi oraz poprawnego zarządzania pamięcią w C (użycie free zamiast delete[]).
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA