[C] Datei auslesen - seltsamer Wert

flogy92

Mitglied
Hallo zusammen!

Ich sitze hier gerade an einer C-Übung. Dabei soll ich unter anderem eine Datei auslesen und die Werte einzeln in einen zweidimensionalen Array speichern.

Diese Datei ist so aufgebaut, dass jede Zeile dieselbe Breite (also Anzahl Zeichen) hat. Mir ist ebenfalls schon bekannt, wieviele Zeilen es total sind.

Das Auslesen und Ausgeben hat prima geklappt. Nur habe ich das Problem, dass manchmal seltsame Werte ausgegeben werden; und zwar die Zahl -38! Nach einigen Tests ist mir aufgefallen, dass -38 immer genau nach 80 weiteren Zeichen wieder ausgegeben wird. Im Array sieht das etwa so aus:

data[0,0] = -38 //seltsamer Wert
data[1,0] = 0 //korrekter Wert
...
data[1,0] = 0
data[1,1] = -38
data[1,2] = 0
...
data[2,0] = 0
data[2,1] = 0
data[2,2] = -38
data[2,3] = 0
...

Und hier mein Code:

Code:
    i = 1;
    char data[b][h];
    int z = 1, r = 1; //Zeichen, Zeile

    while ((c = fgetc(datei)) != EOF)
    {
      data[z][r] = (c - '0'); //Zeichen in einen Array speichern (als integer)
      if (r < 6) //dient nur der Beschränkung der Ausgaben, damit nicht gleich alles auf einmal ausgegeben wird
      {
          printf("%i auf %i, %i\n", data[z][r], z, r); //Das eingelesene Zeichen ausgeben
      }
      
      if (i % b == 0) //Wenn der Zähler i durch die Breite b einer Zeile ohne Rest teilbar ist (bzw. die zeile zu ende ist), soll zu der Row-Zahl r eins addiert,
      {
        r += 1;
        z = 0; //und gleichzeitig der Zeichenzähler z wieder auf Null gesetzt werden
      }
      z += 1;
      i += 1;
    }


Wenn ihr etwas nicht versteht, bitte umgehend fragen! Es ist nämlich ziemlich kompliziert, das Problem zu beschreiben.

Vielen Dank für eure Antworten!


MfG flogy92
 
Zuletzt bearbeitet:
Hi.

Wie hast du die Datei denn geöffnet?

Sicherheitshalber solltest du Eingaben immer prüfen bevor du diese verarbeitest. In dem Fall solltest du sicherstellen, das es sich auch um eine Ziffer handelt:
C:
#include <ctype.h>

if (isdigit(c)) {
  data[z][r] = (c - '0');
} else {
  // Fehler, unerwarteter Wert
}
Gruß

\edit:
Code:
printf("%i auf %i, %i\n", data[z][r], z, r); //Das eingelesene Zeichen ausgeben
Hier ist ein Fehler. Du gibst im Formatstring an das das erste Argument ein Integer wäre. Das stimmt aber nicht, du übergibst einen char! Du mußt hier explizit casten:
C:
printf("%i auf %i, %i\n", (int)data[z][r], z, r); //Das eingelesene Zeichen ausgeben
 
Zuletzt bearbeitet:
Okay, ich habs hier mal ein wenig verbessert(?):

Code:
    i = 1;
    
    char data[b][h];
    
    int z = 0, r = 0; //Zeichen, Zeile
    
    while ((c = fgetc(datei)) != EOF)
    {
      if (isdigit(c))
      {
        data[z][r] = (c - '0'); //Zeichen in einen Array speichern
      }
      
      printf("%i", data[z][r]);
      
      z += 1;
      i += 1;
      
      if (i % b == 0)
      {
        r += 1;
        z = 0;
      }
    }

Nun hat die Ausgabe einfach Werte, wie 8, 19, -24, etc. statt die vorherige -38...
Die -38 entsteht wahrscheinlich wegen des Zeilenumbruchs, der ebenfalls eingelesen und in den Array gespeichert wird!

Ich sehe die Lösung des Problems darin, dass ich eine Abfrage erstelle, ob c = -38 ist. Wenn dies der Fall ist, soll es einfach weggelassen werden und statt dessen die darauf folgende Zahl c in den Array geschrieben werden.

Nun stellt sich aber die Frage, wie ich das mache :s
 
Zurück