Adressen aus Datei lesen

Schnelle objektorientierte, kompilierende Programmiersprache.
Ostrich
Beiträge: 23
Registriert: Fr Okt 03, 2014 2:57 pm

Re: Adressen aus Datei lesen

Beitrag von Ostrich » Mo Okt 27, 2014 9:31 pm

naja es war ja auch nur als beispiel gemeint.
wenn ich eine kurze Datei mit 1234567890 nehme dann lese ich natürlich nicht das 128. zeichen.
Aber selbst beim lesen von zeichen 1 kommt ein föllig anderer wert raus.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Adressen aus Datei lesen

Beitrag von cloidnerux » Mo Okt 27, 2014 9:40 pm

Aber selbst beim lesen von zeichen 1 kommt ein föllig anderer wert raus.
Was erwartest du, was kommt heraus, woran könnte es liegen?
Redundanz macht wiederholen unnötig.
quod erat expectandum

Ostrich
Beiträge: 23
Registriert: Fr Okt 03, 2014 2:57 pm

Re: Adressen aus Datei lesen

Beitrag von Ostrich » Mo Okt 27, 2014 10:47 pm

Hallo
Ok also nochmal alles rein hier.
Hier mein code und die Text Datei als Anhang. sowie das ergebnis der Console.
Ich werwarte die ersten 4 zeichen meiner Datei 1a.txt

Aber selbst das geht nicht.
ich hoffe jetzt ist nochmal klarer geworden wo mein Problem liegt

Code: Alles auswählen

#include <stdio.h>
int main()
{
    int n=0;
    int start=1;
    char chr1[5];
    FILE *file1;
    file1=fopen("1a.txt","r");



fseek(file1, 0, SEEK_END);
printf("Die Datei ist %ld Bytes gross!!\n\n", ftell(file1));


while (n<4)
{
fseek(file1, start, SEEK_SET);
       chr1[n]=getc(file1);
n++;
printf("Zeichen %d ist %d\n",n,chr1[n]);

}


return 0;
}

Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Adressen aus Datei lesen

Beitrag von cloidnerux » Di Okt 28, 2014 7:57 am

Code: Alles auswählen

while (n<4)
{
    fseek(file1, start, SEEK_SET);
    chr1[n]=getc(file1);    //n 
    n++;    //n+1
    printf("Zeichen %d ist %d\n",n,chr1[n]);  //chr1[n+1] ist natürlich nicht gesetzt
}
Dein Fehler liegt in den Indices deines Arrays.
Du inkrementierst zwischen Lesen und Ausgeben, das funktioniert natürlich nicht.
Entweder am Ende oder am Anfang der Schleife inkrementieren.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Ostrich
Beiträge: 23
Registriert: Fr Okt 03, 2014 2:57 pm

Re: Adressen aus Datei lesen

Beitrag von Ostrich » Di Okt 28, 2014 8:04 am

Ok da hast du recht. Aber das was raus kommt
Ist ja nicht in der Datei enthalten. Also muss doch noch woanders ein Fehler sein

mfro
Beiträge: 346
Registriert: Mi Jan 16, 2013 4:58 pm

Re: Adressen aus Datei lesen

Beitrag von mfro » Di Okt 28, 2014 8:28 am

Ostrich hat geschrieben:Ok da hast du recht. Aber das was raus kommt
Ist ja nicht in der Datei enthalten. Also muss doch noch woanders ein Fehler sein
Einigermaßen erstaunlich, wie Programmieren Menschen offensichtlich immer wieder vom logischen Denken abhält ;) - nicht böse gemeint, mir geht's manchmal genauso. Dein Problem hat eigentlich gar nichts mit Programmieren zu tun...

Guck' dir nochmal genau an, was Du da eigentlich gemacht hast:

Code: Alles auswählen

start = 1;                                      // weil Dateien und Arrays an Position 0 anfangen, zeigt start auf das 2. Zeichen in der Datei (und zwar immer)!
... 
while (n<4)                                   // vier mal hintereinander
{
    fseek(file1, start, SEEK_SET);    // Dateizeiger auf jenes zweite Zeichen der Datei setzen

    chr1[n]=getc(file1);                  // zweites Zeichen der Datei nach chr1[n] auslesen
    n++;                                        // n um eins erhöhen, chr1[n] zeigt dann im Array auf ein bis dahin nicht initialisiertes Element
    printf("Zeichen %d ist %d\n",n,chr1[n]);  // eben dieses nicht initialisierte Element ausgeben
}
Also (mindestens) zwei Fehler: erstens zeigt dein Dateizeiger immer auf dieselbe (auch noch falsche) Stelle in der Datei (Du liest also immer dasselbe Zeichen an Position 1) und zweitens gibst Du nicht das Zeichen aus, das Du gelesen hast (sonst hättest Du das wahrscheinlich gleich bemerkt) sondern das im Array nächste, das zu diesem Zeitpunkt noch gar nicht initialisiert ist.
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Adressen aus Datei lesen

Beitrag von cloidnerux » Di Okt 28, 2014 8:48 am

Ist ja nicht in der Datei enthalten. Also muss doch noch woanders ein Fehler sein
Wenn du Variablen nicht initialisierst(vor allem Arrays), daher keinen Wert zuweist, dann kannst du beliebigen Speichermüll lesen. Das ist das was hier passiert.
Es steht noch irgendwas im RAM, das gibst du aus.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Ostrich
Beiträge: 23
Registriert: Fr Okt 03, 2014 2:57 pm

Re: Adressen aus Datei lesen

Beitrag von Ostrich » Di Okt 28, 2014 9:45 am

Also wie gesagt klappt jetzt.
Erweitert habe ich nochmal eine Frage.
Ich will das jetzt mal Binär machen
Hab die Datei mal angehangen

Mein Code so geändert

Code: Alles auswählen

#include <stdio.h>
int main()
{
    int n=0;
    int start=23;
    char chr1[60];
    FILE *file1;
    file1=fopen("1a.bin","rb");



fseek(file1, 0, SEEK_END);
printf("Die Datei ist %ld Bytes gross!!\n\n", ftell(file1));


while (n<20)
{
fseek(file1, start, SEEK_SET);
       chr1[n]=getc(file1);
printf("Zeichen %d ist %X\n",n,chr1[n]);

n++;
start++;

}
return 0;
}
Ausgabe siehe Bild:

Was mich Stört ist Zeichen 1 = FFFFFFA8

Was machen die FFFFFF da? Ich hab doch ein Char und das ist nur ein Byte groß. dürfte doch gar nicht gehen oder?

Danke
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Adressen aus Datei lesen

Beitrag von Xin » Di Okt 28, 2014 10:34 am

Ostrich hat geschrieben:Was mich Stört ist Zeichen 1 = FFFFFFA8
Was machen die FFFFFF da? Ich hab doch ein Char und das ist nur ein Byte groß. dürfte doch gar nicht gehen oder?
Danke
Du hast ein char... ein char ist ein 8-Bit-Wert zwischen -128 und 128 und A8 ist ein negativer Wert. %X gibt ein 32-Bit Wert aus. signed char A8 wird auf signed long konvertiert: FFFFFFA8.
Wenn Du die Chars von 0-255 nutzen möchtest, womit A8 als long auch 000000A8 wäre, also eben A8, wenn man die Nullen wie bei den anderen weglässt, dann musst Du chr1 entsprechend als Array von unsigned chars deklarieren:

Code: Alles auswählen

unsigned char chr1[60];
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten