Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » Daten auslesen und verarbeiten (cat-Befehl)

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
11.04.2015, 23:37 Uhr
tooony



Hallo Leute,

in einer Konsolenanwendung unter GNU/Linux, momentan auf einem Banana Pi, möchte ich in einer Konsolenanwendung ein paar Daten auslesen und damit weiterarbeiten. In der Konsole habe ich ja die Möglichkeit, z.B. mit dem cat Befehl, mir gewisse Dateiinhalte anzeigen zu lassen:

Zum Beispiel mit "cat /sys/devices/platform/sunxi-i2c.0/i2c-0/0-0034/temp1_input" kann ich mir die CPU-Temperatur des Banana Pi auslesen. Dabei würde z.B. der Wert "33800" herauskommen, was 33,8 °C bedeutet. Zum einen muss man also immer noch den Wert umrechnen / anpassen, zum anderen möchte ich damit auch weiterrechnen / weiterarbeiten innerhalb des Quellcodes.

Zur Zeit suche ich noch nach einer Möglichkeit, wie man generell solche Dateien am besten öffnet und ausließt. Mein Ansatz ist momentan mit der Funktion popen(). Macht dies Sinn, oder wäre eine andere Funktion sinnvoller:


Code:
#include <stdio.h>
#include <string.h>

int main() {
    FILE *in;
    extern FILE *popen();
    char buff[512];

    if(!(in = popen("cat /sys/devices/platform/sunxi-i2c.0/i2c-0/0-0034/temp1_input", "r"))){
        return;
    }

    while(fgets(buff, sizeof(buff), in)!=NULL){
        printf("%s\n", buff);
        
        float out = buff / 1000;
        printf("Temperatur: %f Grad\n", out);
    }
    pclose(in);
}



Das Einlesen funktioniert soweit, dennoch bleibt die Umrechnung nicht fehlerfrei. Die Nachkommastellen bleiben auf der Strecke. Wie löst man die Konvertierung von char zu float oder double am besten?

Danke für eure Antworten!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
12.04.2015, 00:49 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hi,

warum denn den umweg über das externe Programm? benutze doch statt popen direkt fopen - ohne cat und nur die datei.

Ansonsten gibt es mehrere Möglichkeiten chararrays zu floats/double/int zu konvertieren - die einfachste in deinem fall ist wohl (ohne fehlerbehandlung)


C++:
FILE* in;
int temp;
float out;

in = fopen("/sys/devices/platform/sunxi-i2c.0/i2c-0/0-0034/temp1_input", "r");

fscanf(in "%d", &temp); // hier wird z.b "45000" (=45°) als ganzzahl eingelesen

out = temp/1000.0; // und hier passend umgerechnet

printf("Temperatur: %f Grad\n", out);

fclose(in);


--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
12.04.2015, 18:32 Uhr
~tooony
Gast


Danke für deine Antwort!

Fehler von mir: In popen() übergeb ich natürlich nur den Pfad der Datei, ohne cat.

Was ist prinzipiell der Unterschied zwischen fopen und popen? Über den Suchriesen habe ich auch einige Ansätze gesehen, in denen in einer C-Anwendung versucht wurde den cat Befehl nachzubasteln. Dabei wurde vorweiegend die Funktion popen() verwendet.

Gruß

Tony
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: