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ę. 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 ); } }
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. |
|
pekfos |
» 2016-11-13 20:14:24 To przypisanie, a nie porównanie. |
|
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. |
|
Monika90 |
» 2016-11-13 20:55:36 Dla float jest format %f |
|
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: 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ę. |
|
j23 |
» 2016-11-15 11:07:05 float * p; ...
while( fscanf( plikF, "%f, ", p ) != EOF ); Czytasz do p, a gdzie to p wskazuje? |
|
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? |
|
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 float p; ...
while( fscanf( plikF, "%f, ", & p ) != EOF );
|
|
« 1 » |