tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
3
ZUGRIFFE
458
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    flogy92 flogy92 ist offline Mitglied Silber
    Registriert seit
    Sep 2007
    Ort
    Schweiz
    Beiträge
    92
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
        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
    Geändert von flogy92 (06.01.09 um 13:50 Uhr) Grund: Code geändert (ein Teil fehlte noch)
     

  2. #2
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    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:
    Code c:
    1
    2
    3
    4
    5
    6
    7
    
    #include <ctype.h>
     
    if (isdigit(c)) {
      data[z][r] = (c - '0');
    } else {
      // Fehler, unerwarteter Wert
    }
    Gruß

    \edit:
    Code :
    1
    
    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:
    Code c:
    1
    
    printf("%i auf %i, %i\n", (int)data[z][r], z, r); //Das eingelesene Zeichen ausgeben
    Geändert von deepthroat (06.01.09 um 14:07 Uhr)
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  3. #3
    flogy92 flogy92 ist offline Mitglied Silber
    Registriert seit
    Sep 2007
    Ort
    Schweiz
    Beiträge
    92
    Okay, ich habs hier mal ein wenig verbessert(?):

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    
        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
     

  4. #4
    flogy92 flogy92 ist offline Mitglied Silber
    Registriert seit
    Sep 2007
    Ort
    Schweiz
    Beiträge
    92
    Okay, es hat nun wirklich mit if ((c - '0') != -38) geklappt!
    Vielen Dank trotzem!

    MfG flogys92
     

Ähnliche Themen

  1. Seltsamer Fehler: Ordner als Datei angezeigt
    Von Sukrim im Forum Microsoft Windows
    Antworten: 0
    Letzter Beitrag: 02.04.08, 11:17
  2. Wert aus Datei auslesen
    Von Rene42 im Forum PHP
    Antworten: 1
    Letzter Beitrag: 01.07.07, 17:41
  3. Antworten: 2
    Letzter Beitrag: 20.02.07, 10:23
  4. Wert aus Datei auslesen..
    Von hazzan im Forum PHP
    Antworten: 2
    Letzter Beitrag: 03.05.05, 19:47
  5. Php Datei auslesen, und Wert ausgeben
    Von Lukasz im Forum PHP
    Antworten: 1
    Letzter Beitrag: 21.11.03, 17:47

Stichworte