Forum: PC-Programmierung C Programmierung Array/Funktion/pointer


von Rejocktana M. (rejocktana_m)


Lesenswert?

Hallo,

ich habe folgenden Code geschrieben um Daten aus einem .TXT-File mittels 
zu lesen.
1
#include <stdio.h>
2
#include <stdlib.h>
3
4
void read_from_file(char *result, int lenght_result)
5
{
6
    
7
    FILE *ptr_file;
8
    char buf[22];
9
    char buf_old[sizeof(buf)];
10
    char candata_needed[4]; 
11
    //while(1){
12
        ptr_file =fopen("/home/pi/probe.txt","r");
13
        if (!ptr_file){
14
            return 1;
15
        }
16
        if (fgets(buf,sizeof(buf), ptr_file)!=NULL){
17
18
            if(memcmp(buf, buf_old, sizeof(buf)))
19
            {
20
                
21
                memcpy(candata_needed, buf + 17, sizeof(buf));
22
                strncpy(result, candata_needed, lenght_result);
23
                
24
                memcpy(buf_old, buf, sizeof(buf));
25
            }
26
        }
27
        
28
        fclose(ptr_file); 
29
}
30
31
32
int main()
33
{
34
        int i;
35
        int size=4;
36
        char *candata = malloc(size);   
37
        char candata_gen [4];        
38
    while(1){
39
       
40
        read_from_file(candata, size);
41
    memcpy(candata_gen, candata, sizeo(candata));
42
       
43
        printf("candata: %s\n", candata); 
44
    printf("candata_gen: %s\n", candata_gen);
45
        
46
    }
47
    free(candata);        
48
    return 0;
49
}

Die Datei enthält Hex. Zahlen und ich speichere nur 4 davon für meine 
Main-Funktion.

Die Daten sollen angezeigt werden und das gelingt mir auch. Nur bekomme 
ich zwei unterschiedliche Daten angezeigt:
Die Variabel
1
candata
 liefert genau 4 Hex. Zahlen z.B. 0xFF89. Ich speichere diesen Wert mit 
Hilfe der Funktion
1
memcpy(candata_gen, candata, sizeo(candata));
 in ein anderes Array und bekomme allerdings beim Anzeigen die ersten 3 
Hex. Zahlen richtig und das letztes erscheint immer als Symbole (z.B. 
0xFF8§). Ich bin neu in der C Programmierung und wollte wissen, wie ich 
es hinkriegen kann, die Daten richtig speichern und anzeigen kann.

von Klaus W. (mfgkw)


Lesenswert?

Hm, die Beschreibung ist etwas wirr und der Quelltext so nicht 
lauffähig.
Bevor jetzt wieder jeder wild herumrätselt, wäre vielleicht eine lesbare 
und verständliche Beschreibung förderlich, und ein lauffähiges Programm.

Nebenbei: wenn man sizeof auf einen Zeiger anwendet, bekommt man die 
Größe des Zeigers, nicht die Größe eines eventuell dafür allokierten 
Feldes.

von Mark B. (markbrandis)


Lesenswert?

Abgesehen von einem falsch geschriebenen sizeof, wodurch das Ganze nicht 
kompiliert:

Du bekommst mehrere Warnungen vom Compiler. Die sollte man einfach mal 
nicht ignorieren, sondern sie entsprechend abarbeiten.

von Dirk B. (dirkb2)


Lesenswert?

Das sizeof(candata) liefert nicht den gewünschten Wert.
(Der mag hier zufällig richtig sein)

printf erwartet bei %s einen Zeiger auf einen Nullterminiertes 
char-Array.
Das ist, durch das memcpy, auch nicht unbedingt gegeben.



Bei memcpy(candata_needed, buf + 17, sizeof(buf)); gibt es auch Müll, da 
candata_needed nur 4 Byte groß ist, du aber 22 Byte kopierst.

: Bearbeitet durch User
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Rejocktana M. schrieb:
> char candata_needed[4];

Wieviele Zeichen passen da wohl rein, wenn man das als String benutzt?

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.