Einlesen von Datei in ein zwedim. Array

sfuccma

Grünschnabel
Hi
Da bin ich mal wieder.......
Neue Aufgabe Neues Prob.......
Wir muessen Prog schreiben fuer einen Sudokuloeser bei mir scheitert es aber schon dabei.......Einlesen der Zahlen aus Datei---mein Prob ist, dass die nicht getrennt sind durch ein leerzeichen oder eine Escapesequenz-sonst würd ich ich bin fscanf arbeiten.....ich kann ja den Code posten dann seht Ihr auch wie wiet ich bin.........

PHP:
#include<stdio.h>
#include<stdlib.h>

#define MAXSPALTE 9
#define MAXZEILE 9

int **file_sudo_lese ( char*str ) /*uebergabe, welche datei will man oeffnen*/
{
   FILE *datei;
   char **hilf;
   int **sudo_feld;
   int i,j;
   
   datei = fopen(str,"rt");
   if(datei==NULL)
   {
      printf("\n\nFehlerbeim oeffnen der Datei!");
      exit(1);;
   }
   
   for ( i=0; i<MAXSPALTE; i++ )      /*zeichen in ein hilfsarray schreiben vom typ char*/
      for ( j=0; j< MAXZEILE; j++ )
         while(!(feof(datei)))
            hilf[i][j]=fgetc(datei);
   
   for ( i=0; i<MAXSPALTE; i++ )  /*umwandeln der zahl in int und kopieren in ein neues array*/
      for ( j=0; j<MAXZEILE; j++ )
         sudo_feld[i][j] = atoi(hilf[i][j]);
   
   return sudo_feld; /*das neue 2d. array zurueckgeben*/
}


Komischerweise meckert er schon beim atoi()........
Wenn nicht mit atoi() womit könnte ich dass denn noch machen......

Zu meiner eigentlichen Frage:
Kann ich die zeichen so einlesen und speichern, wenn der inhalt der Datei so aussieht?:
HTML:
530070000
600195300
098000060
800060003
400803001
700020006
060000280
000419005
000080079

Ich bitte um Rat........

GRUSS sfuccma
 
Hallo sfuccma,

bei "atoi()" stimmt der Parameter nicht, es wird statt eines "char" ein "const char *" erwartet. Allerdings brauchst du für die Konvertierung einer einzelnen Ziffer kein "atoi()".
Außerdem musst du für deine Arrays irgendwo Speicher zuweisen. Du hast nur Zeiger deklariert, die ins nirgendwo zeigen. Am besten legst du das Array außerhalb der Funktion an und übergibst eine Referenz darauf.
Weiterhin musst du berücksichtigen, dass am Ende jeder Zeile Zeichen für den Zeilenvorschub kommen, die du überspringen musst. Hier mal ein Vorschlag für ein zeilenweises Einlesen mit etwas weniger Schleifen (ungetestet). Schaue dir dazu auch mal die Beschreibung von "fgets()" an.
C++:
int i, j;
char buffer[MAXZEILE+2];
int sudo_feld[MAXZEILE][MAXSPALTE];

for( i = 0; i < MAXZEILE; i++ )
{
    if( fgets(buffer, sizeof(buffer), datei) == NULL )
    {
        break; // Fehler oder Dateiende
    } 
    else
    {
        for( j = 0; j < MAXSPALTE; j++ )
        {
            sudo_feld[i][j] = buffer[j] - '0';
        }
    }
}
Gruß
MCoder
 
An fgets hatte ich auch schon gedacht nur ist das fuer mein Problem schaetze ich nicht das richtige, weil ich soll in der Aufgabe ein beliebiges Sudokuraetsel anhand des Backtrackting - Verfahrens loesen......

Meines wissen lese ich ja mit fgets zeilen ein und der Rueckgabewert ist doch die Anzahl der erfolgreich gelesenen Zeilen.....

ich muss in der z.B 1. Zeile eines Sudokuaetsels:

512000304

in mein 2D Array die 5, dann die 1 dann die 2...usw einlesen......
Darum glaub ich das fgets sich mit meiner Aufgabe nich t.......

Gruß sfuccma
 
Hallo sfuccma,

hast du dir das Codebeispiel mal angeschaut? Dort wird erst die Zeile komplett eingelesen und dann werden aus dem Buffer die einzelnen Ziffern extrahiert. Da die Datei (zumindest entnehme ich das so deiner Frage) eine Textdatei ist, in der alle Zeilen des Sudoku auch einer Zeile der Textdatei entsprechen, halte ich die zeilenweise Verarbeitung für einen sinnvollen Ansatz. Außerdem kannst du damit einfacher das schon genannte Problem der Zeilenumbrüche behandeln.

Gruß
MCoder
 
Ach!!

Ich bin aber was doof.......jetzt hab ich es geschnallt......naja werd morgen erstmal alte aufg. testieren und mich dann wieder dran setzten....thx

Gruß sfuccma
 
Zurück