Master_Exploder Temat założony przez niniejszego użytkownika |
[C] Problem z odczytywaniem wielocyfrowych integerów z pliku .txt. » 2016-12-18 21:12:37 Mam plik .txt z napisanymi cyframi: 1 1 1 1 12 1 1 1 1. Chciałbym je wyświetlić i wykonywać później dalsze operacje, ale zaciąłem się w miejscu poniższego fragmentu kodu (printf napisałem dla sprawdzenia co jest odczytywane). int cyfra; FILE * plik;
plik = fopen( "maski.txt", "r" );
l_linii = 0; while( l_linii < N - 1 ) { fscanf( plik, "%d", & cyfra ); printf( "%d", cyfra ); if( cyfra == '\n' || cyfra == feof( "maski.txt" ) ) l_linii++; }
no i na wyjściu mam 49 49 49 49 49 50 49 49 49 49. Zapisuje mi te jedynki jako wartości ASCII i ponadto dwunastka jest rozdzielona na 1 i 2. Jak to naprawić, żeby zapisywało mi 1 z txt jako int 1, a 12 jako int 12? (piszę program do przetwarzania obrazów, to tylko fragment kodu, który mi nie działa, dotyczy wczytywania maski). |
|
Szustarol |
» 2016-12-18 21:27:04 zmień typ zmiennej na wchar albo castuj, poza tym z tego co pamiętam (długo w C zwykłym nie pisałem), zamiast %d możesz użyć %c i wtedy będzie wypis jako char. |
|
mateczek |
» 2016-12-18 21:32:31 ten "if" jest bez sensu !!! jak czytasz inty to nie znaki.A jak znaki to nie linie #include <stdio.h>
int main() { int cyfra; FILE * plik; plik = fopen( "maski.txt", "r" ); while( !feof( plik ) ) { fscanf( plik, "%d", & cyfra ); printf( "%d ", cyfra ); } }
|
|
Master_Exploder Temat założony przez niniejszego użytkownika |
» 2016-12-18 22:11:04 W sumie to źle to opisałem: struct tablicamaski { int rozmiar_tablicy; float * tablica; }; struct tablicamaski * CzytajMaske( int N ) { struct tablicamaski * wsk; wsk =( struct tablicamaski * ) malloc( sizeof( struct tablicamaski ) ); int l_linii, dlugosc; char znak; int i; FILE * plik; fpos_t pos; plik = fopen( "maski.txt", "r" ); l_linii = 0; while( l_linii < N - 1 ) { znak = fgetc( plik ); printf( "%c", znak ); if( znak == '\n' ) l_linii++; } fgetpos( plik, & pos ); dlugosc = 0; do { znak = fgetc( plik ); if( znak != ' ' && znak != ',' && znak != '\n' ) { dlugosc++; } } while( znak != '\n' ); wsk->rozmiar_tablicy = dlugosc; printf( "dlugosc :%d\n", dlugosc ); wsk->tablica =( float * ) malloc( wsk->rozmiar_tablicy * sizeof( float ) ); fsetpos( plik, & pos ); for( i = 0; i < wsk->rozmiar_tablicy; i++ ) { fscanf( plik, "%f,", & wsk->tablica[ i ] ); printf( "%f ", wsk->tablica[ i ] ); } return wsk; }
maski.txt: 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 4 1 1 1 1 1 1 1 1 12 1 1 1 1 (maski mogły mieć jeszcze długości 16;25 itd, więc pisałem tę funkcję uniwersalnie na przyszłość) Pierwotnie to wyglądało tak jak powyżej, pierwsze 3 wiersze działały, ale potem ogarnąłem, że nie zadziała w czwartym, bo jest 12, (albo jak dopiszę linijkę gdzie wartości będą miały minusy) bo pobiera tylko 1 char, próbowałem zmienić typ zmiennej (co było głupie - teraz już wiem) i teraz nie wiem czy jest to jeszcze do uratowania, czy trzeba by od nowa napisać inaczej? |
|
mateczek |
» 2016-12-19 20:24:06 na wzór stringStrem z c++ 1 czytaj getline całą linie do bufora 2 bufor ładuj do strumienia 3 wyciągaj liczby ze strumienia przykład w C #include <stdio.h>
int main() { int cyfra; FILE * plik, * stream; char * buffer; int bufferSize; plik = fopen( "dane.txt", "r" ); while( getline( & buffer, & bufferSize, plik ) != - 1 ) { stream = fmemopen( buffer, bufferSize, "r" ); int cyfra; while( fscanf( stream, "%d", & cyfra ) ) { printf( "%d ", cyfra ); } fclose( stream ); } }
przykład W c++: #include<iostream> #include<fstream> #include<sstream> using namespace std; int main() { string liniaTekstu; fstream plik( "dane.txt" ); while( getline( plik, liniaTekstu ) ) { stringstream ss; ss << liniaTekstu; int liczba; while( ss >> liczba ) { cout << liczba << " "; } } }
|
|
mokrowski |
» 2016-12-19 22:25:04 Linie czytaj getline(...) oraz zapoznaj się z wywołaniem strtok(...) (dość nietuzinkowo pracuje) oraz konwersją z tekstu na float. |
|
mateczek |
» 2016-12-21 08:59:38 PS. Przykład w "C" jak go składałem na Linux mi się skompilował i działał. Ale próba kompilacji na Windows(mingw) sypie błędami: "undefined refernece to getline" Brak jakieś biblioteki do "C" biblioteki zawierającej funkcje getline(), która widać nie występuje w mingw a jest pod linux :(. Więc proste użycie "getline()" do przeczytania wiersza w "C". Może okazać się pod windows trochę kłopotliwe |
|
mokrowski |
» 2016-12-21 11:01:53 W MSYS a dokładniej w pakiecie textutils jest getline() także dla MS Windows. |
|
« 1 » |