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

Konwersja liczby z przecinkiem na float w C - atof zwraca 0.00

Craven 28 Gru 2005 23:26 2943 8
REKLAMA
  • #1 2124824
    Craven
    Poziom 11  
    Posty: 5
    Witam,
    po pierwsze z góry przepraszam jeśli dubluję obecne już na forum pytanie, ale nie znalazłem ręcznie a wyszukiwarka szaleje (nie mogę wejść w wyszukane tematy). :cry:

    Mam nastepujący problem.
    W pliku, z którego mam pobrać liczbę jest ona zapisana jako np 45,24
    funkcja atof(s) zwraca 0.00
    Być może dla tego, że zapis jest z przecinkiem a nie kropką.

    Czy ktoś mógłby mi pomóc w jakiś sposób i zaproponować jak z postaci liczba,liczba zrobić zmienną float?

    Poniżej wklejam fragment kodu programu:

    if(strcmp("cena</td>",s))
    {
    	fscanf(plik,"%s",s);
    	cena = atof(s);
    }


    Z góry bardzo dziękuję za pomoc.
  • REKLAMA
  • #2 2124879
    one_eddie
    Poziom 25  
    Posty: 973
    Pomógł: 62
    Ocena: 14
    Z tego co pamietam funkcja atof czeka na kropke nie przecinek (chodzi o separator dziesietny).

    Ponizej prosty kod zamieniajacy , na .

    char* str = s;
    while ( *str )
    {
      if ( *str == ',' )
         *str = '.';
      ++str;
    }


    Dodano po 11 [minuty]:

    Mozna tez tak:
    int cal, ul;
    fscanf( plik, "%d,%d", &cal, &ul );

    Oczywiscie dostaniemy z tego 2 liczby z ktorych trzeba utworzyc liczbe rzeczywista.
  • REKLAMA
  • #3 2125696
    Craven
    Poziom 11  
    Posty: 5
    Dzięki za pomoc. Niestety najwyraźniej problem nie tkwi tylko w tym przecinku. Coś musiałem pomieszać z samą funkcją, bo zwraca mi wciąż same zera (nawet jeśli nie konwertowałem zawartości s na floata)...

    Napisałem teraz coś takiego:

    #include<stdio.h>
    #include<conio.h>
    #include<string.h>
    #include<stdlib.h>
    
    
    
    int main(int argc, char *argv[])
    {
    
    FILE *plik;
    char s[1000];
    float jeden, dwa ;
    char skan[1000];
    
    
    if ((plik = fopen("artykul.txt", "r")) == NULL)
    	printf( "Cannot open %s\n", "output_file");
    
    while( fscanf(plik,"%s",s) != EOF )
        {
    	if(!strcmp("wypisze",s)){
    		fscanf(plik,"%s",s);
    		printf("jeden : %4.2f \n",s);
    		jeden = atof(s);
    
    	}
    	{
    	if(!strcmp("tutaj",s)){
    		fscanf(plik,"%s",s);	// omijamy wyrażenie "wypisze"
    		fscanf(plik,"%s",s);
            printf("dwa : %4.2f \n",s);		
    		dwa = atof(s);
    	}
    	{
    	if(!strcmp("tekst",s)){
    		fscanf(plik,"%s",s);
            printf("skan : %4.2f \n",s);		
    	}
    };
    
    
    printf("jeden : %4.2f \n",jeden);
    printf("dwa : %4.2f \n",dwa);
    printf("skan : %4.2f \n",s);
    
    
    fclose(plik);
    getch();
    }}}



    artykul.txt wygląda tak:
    bzdury dowolne które tutaj wypisze 12.4
    teraz wyszukaj tekst pupa


    program po uruchomieniu wywala mi:
    jeden : 0.00
    dwa : 0.00
    skan : 0.00


    I to pojedynczo - spodziewałem się, że wyrzuci 6 linijek - trzy stringi s i potem trzy z tej końcówki.
    Tak czy inaczej nie działa to tak jak sobie wyobrażałem :(
  • Pomocny post
    #4 2125809
    one_eddie
    Poziom 25  
    Posty: 973
    Pomógł: 62
    Ocena: 14
    Napisz co ma dokladnie robic ten program, podaj dane we i dla przykladu dane wy. Wtedy postaramy sie cos zrobic.

    Jesli chodzi o twoj kod wyglada na nieco nieprzemyslany, wiec nie bede go poprawial.
  • REKLAMA
  • #5 2125939
    Craven
    Poziom 11  
    Posty: 5
    Po pierwsze wielkie dzięki za pomoc.

    Teraz co mi jest potrzebne:

    program ściąga już kod htmla z sieci do pliku, teraz musi z niego pobrać kilka danych: godzinę, minutę i sekundę oraz cenę.

    wzorzec czasu jest taki:
    class=small>(pon 07 lis 2005 11:33:10 CET)
    class=small>( - ten ciąg pojawia się jedynie w tym miejscu, więc jeśli go znajdziemy wiemy że po nim wystąpi dzień miesiąca, miesiąc, rok a następnie godzina.

    wzorzec ceny jest taki:
    mniej niż: 40,00 zł):
    mniej niż: też występuje tylko raz w kodzie.

    godzina minuta i sekunda to dwucyfrowe inty, cena powinna byc floatem ale mozna tez ja pewnie pobrac jako dwa inty i potem grosze podzielic przez 100 i dodac do zlotowek i sam wyjdzie float.
  • #6 2126428
    JanuszPulit
    Poziom 17  
    Posty: 175
    Pomógł: 14
    Ocena: 4
    A cóż to powstaje kolejny automatyczny licytator na allegro?? :D

    Nie rozumiem twojego pytania, jaki jest twój problem ? Nie umiesz tego wyciągnąć z pliku? Przecież poprzednio to robileś?
  • REKLAMA
  • #7 2126711
    Craven
    Poziom 11  
    Posty: 5
    Najwyraźniej źle. Bo nieważne czy co i jak wyciągałem zwracało mi zawsze zera. Dlatego teraz napisałem o co dokładnie chodzi, i w sumie jakakolwiek metoda wyciągania tych danych w języku c mnie zadowoli.

    Licytator owszem, ale to tylko na projekt, który okazał się nie byc tak prosty dla takiego laika jak ja. A termin tuż tuż.
  • #8 2126981
    JanuszPulit
    Poziom 17  
    Posty: 175
    Pomógł: 14
    Ocena: 4
    Twój problem polega na bałaganie w kodzie. Miałeś w złych miejscach pozamykane nawiasy klamrowe, dlatego wczytywales tylko jeden wyraz z pliku. Polecam robienie wcięć w kodzie i używanie środowiska które podświetla pary nawiasów. Oprócz tego czy potrafisz używać debuggera? Przecież gdybyś go użył to zauważyłbyś błąd.
    Zobacz sam:

    
    
    int main(int argc, char *argv[]) 
    { 
    
    FILE *plik; 
    char s[1000]; 
    float jeden, dwa ; 
    char skan[1000]; 
    
    
    if ((plik = fopen("artykul.txt", "r")) == NULL) 
       printf( "Cannot open %s\n", "output_file"); 
    
    while( fscanf(plik,"%s",s) != EOF ) 
    {
       if(!strcmp("wypisze",s)) { 
    	  fscanf(plik,"%s",s); 
    	  printf("jeden : %4.2f \n",s); 
    	  jeden = atof(s); 
       } 
       
       if(!strcmp("tutaj",s)) { 
    	  fscanf(plik,"%s",s);   // omijamy wyrażenie "wypisze" 
    	  fscanf(plik,"%s",s); 
    	  printf("dwa : %4.2f \n",s);       
    	  dwa = atof(s); 
       } 
       
       if(!strcmp("tekst",s)) { 
    	  fscanf(plik,"%s",s); 
    	  printf("skan : %4.2f \n",s);       
       } 
    
    } 
    
    
    printf("jeden : %4.2f \n",jeden); 
    printf("dwa : %4.2f \n",dwa); 
    printf("skan : %4.2f \n",s); 
    
    
    fclose(plik); 
    getch(); 
    }
    
  • #9 2127220
    Craven
    Poziom 11  
    Posty: 5
    Thx. Już lepiej przy czym dziwne działa (może stąd problemy mam we właściwej wersji programu) bo tak w sumie to poprawnie działa tylko środkowe skanowani i zwraca 12.40 bo jeden wychodzi 0.00 a skan 12.40

    Innymi słowy nie rozumiem czemu nie zczytuje poprawnie do zmiennej jeden 12.40 ani czemu skan nie zwraca pupy

    Dodano po 3 [godziny]:

    OK. Już sobie poradziłem. W sumie wszystko inaczej ale ważne, że działa.
    Dzięki wszystkim za pomoc.

    Dla zainteresowanych fragment kodu:

      FILE *plik;
      char s[1000];
      float cena;
    
    int hh, mi, ss, zlote, grosze;
    FILE* file = fopen("allegro.html", "r");
    if(!file){perror("fopen");exit(errno);}
    char buffer[1000];
    while(fgets(buffer, sizeof(buffer), file))
    
                       {
    char*p = strstr(buffer, "<span class=\"small\">(");
    if(p){ 
         sscanf(p, "%*[^ ] %*[^ ] %*[^ ] %*[^ ] %*[^ ] %d:%d:%d", &hh, &mi, &ss);
         continue;
         }
    p = strstr(buffer, "nie mniej ni");
    if(p){ 
         sscanf(p, "%*[^0-9]%d,%d", &zlote, &grosze);
         }
                       }
    printf("%d:%d:%d cena minimalna:%d,%d\n\nNacisnij dowolny klawisz\n\n", hh, mi, ss, zlote, grosze);
    
    
    fclose(file);
    getch();
    
    cena = zlote + grosze/10;

Podsumowanie tematu

✨ Problem dotyczy konwersji liczby zapisywanej w pliku tekstowym w formacie z przecinkiem jako separatorem dziesiętnym (np. 45,24) na typ float w języku C. Funkcja atof() zwraca 0.00, ponieważ oczekuje kropki jako separatora dziesiętnego. Zaproponowano prostą metodę zamiany przecinka na kropkę w łańcuchu znaków przed konwersją. Alternatywnie można wczytać liczbę jako dwie części całkowite (część całkowitą i ułamkową) za pomocą fscanf() z formatem "%d,%d" i następnie złożyć je na float. Autor programu miał problemy z poprawnym wczytywaniem danych z pliku HTML, co wynikało z błędów w strukturze kodu i złym zarządzaniu nawiasami klamrowymi. Po poprawkach i zastosowaniu funkcji strstr() do wyszukiwania wzorców w liniach pliku oraz sscanf() do parsowania wartości liczbowych, udało się poprawnie wyciągnąć dane takie jak godzina, minuta, sekunda oraz cena. Ostatecznie autor przedstawił działający fragment kodu, który czyta plik HTML, wyszukuje odpowiednie wzorce tekstowe i konwertuje liczby z przecinkiem na float, co rozwiązało problem.
Wygenerowane przez model językowy.
REKLAMA