Avatar billede nfotx2 Nybegynder
04. juni 2002 - 18:00 Der er 6 kommentarer og
1 løsning

Char til float?

Hej! Sidder og laver et program til neurale netværk i c++, og er løbet ind i et lille problem... Jeg skal loade nogle variabler fra en tekstfil som jeg har skrevet, hvilket også virker fint nok, men bare ikke helt hensigtsmæssigt. De variabler jeg loader skal nemlig ligges ind i et array af typen float. MEN hvis jeg bare gør det at jeg ligger en linie fra tekstfilen ind i fx et array "char buffer[256]" og lægger den variabel ind i mit array, får jeg ikke det der står i tekstfilen men ASCII koden/koderne for det. Hvordan undgår jeg dette problem?
Avatar billede jespernaur Nybegynder
04. juni 2002 - 19:15 #1
Du bør lære dig at benytte scanf fra <stdio.h> - den tillader dig alle de konverteringer, du måtte ønske.

Mvh
Jesper Naur
Avatar billede kamikaze Nybegynder
05. juni 2002 - 10:17 #2
Kan du ikke poste koden hvor du læser filen???
Avatar billede jespernaur Nybegynder
05. juni 2002 - 11:51 #3
Her er et ret komplet eksempel, med fejlbehandling og det hele:

#include <stdio.h>

void main(void)
{
  FILE *input_file;
  char str[100];
  char filename[] = "float.txt";
  float fval;
  int scanstatus;

  input_file = fopen( filename, "r" );
  if (input_file == NULL) {
      printf("could not open file %s\n", filename);
  }
  else {
      while (fgets(str, sizeof(str), input_file)) {
        scanstatus = sscanf(str, "%f", &fval);
        printf("scanstatus = %d\n", scanstatus);
        if (scanstatus == 1) {
            printf("fval = %f\n", fval);
        }
        else {
            printf("fscanf conversion error, scanstatus = %d\n", scanstatus);
            printf("error occurred in line %s",str);
        }
      }
      fclose(input_file);
  }
}

Du skal lave en file float.txt, med 1 tal per linie, herunder har
jeg med vilje lavet en ulovlig linie 3:

1.2
33.444
ee

Mvh
Jesper Naur
Avatar billede soepro Nybegynder
06. juni 2002 - 08:19 #4
Du kan konvertere fra ASCII-tekst til float vha. atof() og atod() funktionerne:

char *textNumber    = "1234.678";
float floatNumber  = atof(textNumber);
double doubleNumber = atod(textNumber),

Ikke gyldige værdier vil blive "oversat" til 0.
Avatar billede bjk Nybegynder
10. juni 2002 - 19:50 #5
Når du bruger c++ vil jeg anbefale dig at bruge streams, de er lette at bruge og har overloade operatorer der gør at du kan læse direkte ind i en float. Og i modsætning til scanf er de type-sikre.

Eksempel :

#include <fstream.h>
#include <libc.h>

void main(void)
{
ifstream MyFile("c:\myfile.txt");
float f;
if (MyFile){
    float f;
    float f2;
    MyFile >> f;
    MyFile >> f2;
    //etc..
}
else {
    //error: kunne ikke åbne filen
}
}
Avatar billede soepro Nybegynder
11. juni 2002 - 08:18 #6
bjk >> Hvad mener du med at de er type sikre ? Hvis filen ikke rent faktisk indeholder en float, vil den overloadede >> da stå med nøjagtig samme problem, som de øvrige funktioner der er nævnt ovenfor.
Avatar billede bjk Nybegynder
11. juni 2002 - 19:30 #7
Det jeg mente er at at scanf og de andre lignende funktioner i c-bibliotekerne ikke er type-sikre..hvis du kommer til at ændre på parametrene til scanf uden at ændre strengen, eller hvis strengen er forkert, så har du en fejl som du tidligst opdager ved run-time. Hvis du angiver en parameter af en type som ">>"-operatoren ikke er overloaded for vil den brokke sig på compile-tidspunktet.
Så det jeg hentydede til er ikke om hvor vidt det der står i filen er gyldigt eller ej, men at det man læser ind i float variablen altid er en float, og ikke noget af en udefineret type...med ">>"-operatoren kan compileren garantere at man ikke prøver at smide en streng over i en variabel af typen float, hvilket ikke er tilfældet for sscanf o.l...

Hvis filen indeholder noget anden end end float, og du vil læse den ind i en float står du med et problem under alle omstændigheder, så hvis det er en situation der kan forekomme skal man checke for det. Hvilket man let nok kan gøre uanset hvilken af metoderne man bruger. Sscanf er en funktion med variabelt antal parametre, hvilket pr. definition ikke er type-sikkert, hvilket kan være en god grund til at undgå den.

Jeg har forresten ikke noget imod atof() og atod(), men man kan spare sig at læse ind i en char array ved at bruge streams.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester