Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Wczytywanie floatów z pliku .csv

Ostatnio zmodyfikowano 2016-11-16 19:01
Autor Wiadomość
Talamak
Temat założony przez niniejszego użytkownika
Wczytywanie floatów z pliku .csv
» 2016-11-13 20:08:55
Cześć wszystkim forumowiczom. Parę ładnych razy otrzymałem już świetną i fachową pomoc na tym forum, a więc spróbuję po raz kolejny. Mam do napisania duży (jak dla mnie) projekt, którego jedną z części jest wczytanie z wcześniej zapisanego pliku csv wartości i zapisanie ich w tablicy. Nie mogę sobie poradzić z fscanf-em, a inne funkcje średnio mi do tego pasują. Zależy mi po prostu, żeby program po kolei odczytywał wartości floatów, które są oddzielone przecinkami i wpisywał je do tablicy. Mnie po rzekomym wczytaniu i wyświetleniu elementów tablicy, wyskakują same zera. Czytałem już parę tematów i nic z tego nie wyszło. Na początku jest tekst (swoją drogą nie mam pojęcia jak go "ominąć"), ale próbowałem i bez niego i nadal bez rezultatu.


Chciałem zapytać jeszcze o jedną rzecz. Czy używając np fscanf-a dwa razy program wczyta powiedzmy jeden fragment, a później automatycznie następny? Czytając inne tematy zrozumiałem, że tak to działa - program automatycznie "przeskakuje kursorem" po przeczytaniu zadanego fragmentu na następny i nie trzeba o to dbać. Czy rzeczywiście tak to działa?

Załączam kody do poszczególnych funkcji.
Z góry dziękuję.


C/C++
// funkcja, ktora zapisuje dane
void zapisdoplikufiltr( float * tablicaodfiltrowana, int m )
{
    int i;
    FILE * plikF;
    if(( plikF = fopen( "plikF.csv", "w" ) ) == NULL )
    {
        printf( "Nie mozna znalezc pliku plikF.csv\n" );
        exit( 1 );
    }
    else
    {
        fprintf( plikF, "Wartosci odfiltrowane:\n" );
        for( i = 0; i < m; i++ )
        {
            fprintf( plikF, "%f, ", *( tablicaodfiltrowana + i ) );
        }
        fclose( plikF );
    }
}



C/C++
// funkcja, ktora zle odczytuje wartosci
void odczytpliku( float * tablica )
{
    int i;
    FILE * plikF;
    plikF = fopen( "plikF.csv", "r" );
    if( plikF = NULL )
    {
        printf( "Nie mozna wczytac pliku." );
    }
    else
    {
        for( i = 0; i <= 25; i++ )
        {
            fscanf( plikF, "%lf, ",( tablica + i ) );
            printf( "\n%f", *( tablica + i ) );
        }
       
    }
   
}

Wszystkie tablice są wcześniej dynamicznie zaalokowane w main-ie.

P-153645
pekfos
» 2016-11-13 20:14:24
C/C++
if( plikF = NULL )
To przypisanie, a nie porównanie.
P-153647
Talamak
Temat założony przez niniejszego użytkownika
» 2016-11-13 20:49:31
Tak, racja, podstawowy błąd. Już poprawione, ale niestety nie to jest przyczyną moich problemów.
P-153652
Monika90
» 2016-11-13 20:55:36
Dla float jest format %f
P-153653
Talamak
Temat założony przez niniejszego użytkownika
» 2016-11-15 03:13:18
Dobrze, poprawiłem już, jak mi się zdaję, najważniejsze błędy i wymyśliłem taki oto kod. Według mnie jest to logiczne:
najpierw mam tablice jednoelementową, wkładam do zerowego wyrazu pierwszą zmienną, powiększam tablice o 1 i jeśli plik się jeszcze nie kończy (bo fscanf zwraca EOF, gdy się kończy, tak?) to wkładam kolejną zmienną do kolejnego elementu powiększonej wcześniej tablicy itd.
Załączam kod:

C/C++
int i;
float * p;
float * wczytanatablica;
wczytanatablica = malloc( 1 * sizeof( float ) );
FILE * plikF;
plikF = fopen( "plikF.csv", "r" );

i = 0;
do
{
    fscanf( plikF, "%f, ",( wczytanatablica + i ) );
    wczytanatablica = realloc( wczytanatablica,( i + 2 ) * sizeof( float ) );
    i++;
}
while( fscanf( plikF, "%f, ", p ) != EOF );


Problem jest taki, że program mi się na tym wykłada - awaryjne wyłączenie. Co jest nie tak?
Z góry dziękuję.
P-153711
j23
» 2016-11-15 11:07:05
C/C++
float * p;
...

while( fscanf( plikF, "%f, ", p ) != EOF );
Czytasz do p, a gdzie to p wskazuje?
P-153723
Talamak
Temat założony przez niniejszego użytkownika
» 2016-11-16 18:56:19
To jest po prostu jakiś zarezerwowany adres. Nie może tak być? Muszę wskaźnikowi p przypisać zmienną, na którą wskazuje?
P-153790
michal11
» 2016-11-16 19:01:15
To jest po prostu jakiś zarezerwowany adres

ja tam nie widzę żebyś coś rezerwował.

Jeżeli tylko nie musisz tej zmiennej nigdzie wykorzystywać poza scope'm to wystarczy
C/C++
float p;
...

while( fscanf( plikF, "%f, ", & p ) != EOF );

P-153792
« 1 »
  Strona 1 z 1