Forum: PC-Programmierung Hex Zahlen aus Datei lesen und in char[] = {} im Programm speichern in C


von Steve N. (stev_ter)


Lesenswert?

Hallo

ich brauche bitte Ihre Hilfe um mein Projekt weiterzumachen.

in der Datei test.txt sind folgende Datenframe mit der Größe 256 Byte 
gespeichert 01 AA FF AB ... .
Ich muss alle Zeile der test.txt nacheinander lesen und in einer 
Variable char cmd[] = {0x01, 0xAA, 0xFF, 0xAB,...} und über RS422 zu 
übertragen.

nachdem ich die Datei geöffnet habe, lese ich die erste Zeile mit 
getline und speichere in cmd aber als String. Wie kann ich es jetzt in 
der form char cmd[] = {......} haben.
1
int main(void) {
2
   FILE *datei;
3
   //char array1[] = {0xAB, 0x02, 0x03, 0x05};
4
   //char array[] = "AB 02 03 05";
5
   //char adr_len[2];
6
   //char a = 'A';
7
8
   //printf("%s\n", array1);
9
   //printf("interger von A: %X\n", (int)a);
10
   //fprintf(stdout, "%x\n", array1[0]);
11
   //fprintf(stdout, "0x%2X\n", array1[0]);
12
   //fprintf(stdout, "%d\n", array1[0]);
13
14
15
   char *cmd;
16
   int readed, i;
17
   size_t *t = malloc(0);
18
   char *cmd1 = "0x";
19
   char **gptr = malloc(sizeof(char*));
20
   *gptr = NULL;
21
22
   datei = fopen("test.txt", "r");
23
   if(NULL == datei) {
24
      fprintf(stderr, "Konnte Datei \"test.txt\" nicht öffnen! : %s\n", strerror(errno));
25
      return EXIT_FAILURE;
26
   }
27
28
   while((readed=getline(&cmd, t, datei)) > 0){
29
    printf("readed:  %d\t", readed);
30
    printf("%s\n", cmd);
31
32
    for(i=0; i<readed; i+=2){
33
        
34
   }
35
   }
36
   return EXIT_SUCCESS;
37
}

Ich freue mich auf ihre Hilfe

: Verschoben durch User
von Felix U. (ubfx)


Lesenswert?

Sehr geehrter Herr Nguembou,

danke für Ihre Anfrage. Es bietet sich an, hier byteweise vorzugehen. 
Ein zeilenweises Einlesen ist nicht vorteilhaft. Gerne übermittle ich 
Ihnen anbei einen beispielhaften Sourcecode.


1
#include <stdio.h>
2
#include <string.h>
3
4
int main()
5
{
6
    FILE *datei = fopen("test.txt", "r");
7
8
    char cmd[256];
9
    char octet[4];
10
    octet[3] = 0;
11
12
    while (true) {
13
        for (int i = 0; i < 256; i++) {
14
15
            // 3 Zeichen lesen: Byte + leerzeichen bzw newline
16
            if (fread(octet, 1, 3, datei) != 3)
17
                goto out;
18
19
            unsigned hex;
20
            if (!sscanf(octet, "%02x", &hex))
21
                goto out; // error
22
23
            cmd[i] = hex;
24
        }
25
26
        // handle cmd[]...
27
    }
28
out:
29
    fclose(datei);
30
31
    return(0);
32
}

: Bearbeitet durch User
von Steve N. (stev_ter)


Lesenswert?

Danke für die Antwort. Der Code liest die ganze Datei aus, obwohl ich 
erst eine Zeile lesen und verarbeiten will, bevor ich zu der nächsten 
Zeile gehe.
Aber danke für die Hilfe ich kann damit schon die korrekte HEX-zahl 
haben. ich versuche daran nochmal zu arbeiten.

Frage: die Funktion fread liest das Leerzeichen auch als newline?

von jz23 (Gast)


Lesenswert?

Und warum willst du nicht erst die komplette Datei einlesen und 
anschließend übetragen, ausgeben, wasauchimmer?

Aus deinem Text geht auch nicht hervor, wie genau die Datei aussieht. 
Sind die Zahlen als Text dadrin gespeichert? Falls ja, wieso? Falls 
nein, was hat das dann mit zeilenweisem Einlesen zu tun?

von Steve N. (stev_ter)


Lesenswert?

jz23 schrieb:
> Und warum willst du nicht erst die komplette Datei einlesen und
> anschließend übetragen, ausgeben, wasauchimmer?

Die Datei besteht aus mehrere Zeilen und jede Zeile enthält ein Kommando 
mit Parametern und Adresse der anzusprechenden Karte. Aus diesem Grund 
muss die Übertragung Zeile für Zeile erfolgen.



> Aus deinem Text geht auch nicht hervor, wie genau die Datei aussieht.
> Sind die Zahlen als Text dadrin gespeichert? Falls ja, wieso? Falls
> nein, was hat das dann mit zeilenweisem Einlesen zu tun?

Bsp Inhalt der Datei test.txt

AA 10 03 FF AB DC
AB 10 03 FF AB DC
EA 10 03 FF AB DC
FA 17 43 FF AB DC
AA 11 23 FF AB DC
...

von Steve N. (stev_ter)


Lesenswert?

Felix U. schrieb:

>
1
An dieser Stelle kann mann nicht mit der cmd[] arbeiten, da nach der for-Schleife das Programm zu der Marke out springt. 
2
>         // handle cmd[]...
3
>     }
4
> out:
5
>     fclose(datei);
6
> 
7
>     return(0);
8
> }
9
>

von Felix U. (ubfx)


Lesenswert?

Steve N. schrieb:
> An dieser Stelle kann mann nicht mit der cmd[] arbeiten, da nach der
> for-Schleife das Programm zu der Marke out springt.

Das sollte nur nach den letzten 256 Byte der Fall sein, das Programm 
lässt sich aber natürlich beliebig anpassen.

Steve N. schrieb:
> Aus diesem Grund
> muss die Übertragung Zeile für Zeile erfolgen.

Wenn jede Zeile genau 256 Oktets hat die mit einem Leerzeichen getrennt 
ist, sollte es ja funktionieren. Eine ganze Zeile einzulesen ist immer 
komplizierter, weil du vorher nicht weißt wie lang sie ist.

von Amateur (Gast)


Lesenswert?

Ein wenig Neugierde kann nicht schaden:
1. Hast Du, zwecks besserer Lesbarkeit, z. B. zwischen "AA" und "10"
   ein Leerzeichen eingefügt, oder sind die wirklich vorhanden?
2. Was folgt auf "DC"? Ein Leerzeichen, ein Return oder von Kleinweich
   ein CR/LF?

Kann nicht schaden das zu wissen.

von Steve N. (stev_ter)


Lesenswert?

Felix U. schrieb:

> Das sollte nur nach den letzten 256 Byte der Fall sein, das Programm
> lässt sich aber natürlich beliebig anpassen.



> Wenn jede Zeile genau 256 Oktets hat die mit einem Leerzeichen getrennt
> ist, sollte es ja funktionieren. Eine ganze Zeile einzulesen ist immer
> komplizierter, weil du vorher nicht weißt wie lang sie ist.

Stimmt danke ich habe es schon geschafft zeilenweise zu lesen und zu 
übertragen. es klappt 1 zu 1:)

von Steve N. (stev_ter)


Lesenswert?

Amateur schrieb:
> Ein wenig Neugierde kann nicht schaden:
> 1. Hast Du, zwecks besserer Lesbarkeit, z. B. zwischen "AA" und "10"
>    ein Leerzeichen eingefügt, oder sind die wirklich vorhanden?

Nein es sieht genau so aus. Zwischen jede Hex gibt's ein Leerzeichen.



> 2. Was folgt auf "DC"? Ein Leerzeichen, ein Return oder von Kleinweich
>    ein CR/LF?
>
> Kann nicht schaden das zu wissen.

nach dem "DC" folgt ein LF.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.