hilfe bei auslesen aus einer datei in string



  • hi,

    mein Problem sieht folgendermasen aus: ich möchte gerne aus einer Datei die einzelnen Zeichen auslesen und in ein Feld speichern, sodass ich sie nachher bearbeiten kann, ich habe bereits folgenden quelltext:

    #include<conio.h> 
    #include<stdio.h> 
    #include<string.h> 
    #include<stdlib.h> 
    
    int main(int argc, char* argv[]) 
    { 
    FILE *datei; 
    char filename[255]; 
    
    //Falls die Datei zum öffnen nicht als Argument übergeben wurde... 
    if(argc<2) 
    { 
    printf("Welche Datei wollen Sie öffnen: "); 
    scanf("%s",filename); 
    datei=fopen(filename, "r"); 
    if(datei!=NULL) { 
    while((c=fgetc(datei))!=EOF) { 
    //putchar(c); 
    z1++; 
    } 
    } 
    else 
    printf("Datei konnte nicht geöffnet werden!\n"); 
    } 
    else { 
    datei=fopen(argv[1],"r"); 
    if(datei!=NULL) { 
    while((c=fgetc(datei))!=EOF) { 
    //putchar(c); 
    z1++; 
    } 
    } 
    
    else 
    printf("Datei %s konnte nichtg geöffnet werden!\n",argv[1]); 
    } 
    zeichenfeld=(char) malloc(sizeof(z1)); 
    
    while(!feof(datei)){ //funktioniert nicht!! 
    fgets(feldch,z1,datei); 
    sscanf(feldch,"%d",feldch2[index]); 
    printf("%d",feldch2[index]); 
    printf("1"); 
    index++; 
    } 
    
    getch(); 
    return 0; 
    }
    

    mir fehlt das auslesen und in ein Feld speicher, werke schon seit Tagen daran und komme nicht wieter! habe schon alle funktionen (fgetc, sscanf,...) kenne mich mit denen aber nicht sehr gut aus!
    Ich hoffe mir kann jemand helfen!!!!!

    mfg. max

    Edit by AJ: Ohne Codetags geht da gar nix ;).



  • Da wo du deinen Kommentar "funktioniert nicht" hingeschrieben hast, ist der Knackpunkt bzw. davor. Du bist zuerst die ganze Datei durchgegangen, um rauszufinden wieviele Zeichen sie enthält. Dazu hast du bis zum Dateiende gelesen, d. h. jede nachfolgende Leseoperation ist auch am Dateiende! feof() liefert natürlich wahrheitsgemäß, dass du am Dateiende bist.

    Lösung:
    Du setzt den Dateizeiger mittels fseek() wieder auf den Anfang der Datei nachdem du ermittelt hast wieviele Zeichen in der Datei sind.

    fgets() gibt übrigens auch einen bestimmten Rückgabewert zurück, wenn es das Dateiende liest. Das solltest du noch abfangen in deiner Schleife. feof() liefert auch erst Wahr zurück, wenn eine Lesefunktion das Dateiende gelesen hat!



  • danke erstmals für die hilfe, meine Lösung sieht jetzt für fseek folgendermasen aus:

    fseek(datei,0,SEEK_SET)
    

    Allerdings meldet er einen fehler bei der darauffolgenden schleife in zusammenhang mit dem sscanf, kann mir bitte jemand sagen welchen Syntax- Fehler ich in den Schleifen gemacht habe /gemacht haben könnte?

    mfg.max_88



  • ich will ja nicht drängen, aber ich benötige dringend hilfe, ist ein Teil eines projektes und ohne dass wird das weitermachen etwas schwierig!
    ich zähle auf euch!!



  • Wenn du uns die Fehlermeldung nicht sagst, können wir dir auch nicht helfen ;).

    Hast du meinen letzten Absatz auch beachtet?? Erst nachdem fgets() den Status zurückgeliefert hat, dass das Dateiende erreicht wurde, kann das auch feof()! D. h. du musst in deiner Schleife den Rückgabewert von fgets() prüfen.



  • [C++ Error] machz.cpp(126): E2285 Could not find a match for 'sscanf(undefined,char *,char)'.

    printf("\n%d",z1);
        zeichenfeld=(char) malloc(z1*sizeof(char));
    
        fseek(datei,0,SEEK_SET);
    
        while(!feof(datei)){ //funktioniert nicht!!
            fgets(feldch,z1,datei);
          // sscanf(&zeichenfeld,"%d",feldch2[index]);
            sscanf(&zeichenfeld[index],"%d",feldch[index]);
            index++;
        }
    

    ich verzweifle langsam, hab schon wirklich alles mir bekannte ausprobiert, kann mirjemand eine Problemlösung vorschlagen!??!!?!??!!?!? 😕 😕

    ich hoffe ich kann auf euch zählen!



  • max_88 schrieb:

    ich verzweifle langsam, hab schon wirklich alles mir bekannte ausprobiert, kann mirjemand eine Problemlösung vorschlagen!??!!?!??!!?!? 😕 😕
    ich hoffe ich kann auf euch zählen!

    erstmal brauchste ein paar variablen

    FILE *datei;
        long groesse;
        char dateiname[MAX_PATH];  // <<- hier pfad angeben
        char *zeichenfeld;
        int index;
    

    'dateiname' solltest du natürlich mit dem namen der gesuchten datei füllen (so wie du's z.b. mit scanf gemacht hast). als nächstes brauchste die grösse der datei. das geht z.b. mit fseek. das rewind bringt den dateizeiger wieder auf den anfang

    // datei öffnen, grösse rauskriegen
        datei = fopen (dateiname, "rb");
        fseek (datei, 0, SEEK_END);
        groesse = ftell(datei);
        rewind(datei);
    

    jetzt holste dir speicher für den dateiinhalt

    zeichenfeld = malloc(groesse);
    

    und so kannste z.b. die datei einlesen

    index = 0;
        while(1)
        {
            int c = fgetc (datei);
            if (c == EOF)
                break;
            zeichenfeld[index++] = (char)c;
        }
    

    zum schluss noch ein kleiner test, dass auch alles geklappt hat

    for (index=0; index<groesse; index++)
            putchar (zeichenfeld[index]);
    

    btw: in einem echten programm musste noch die rückgabewerte der FILE-funktionen beachten. hoffe das hilft 😉



  • DANKE!!!!!! 👍 👍
    Werde es gleich mal ausprobieren...... Falls noch Fragen sind melde ich mich....



  • max_88 schrieb:

    [C++ Error] machz.cpp(126): E2285 Could not find a match for 'sscanf(undefined,char *,char)'.

    printf("\n%d",z1);
        zeichenfeld=(char) malloc(z1*sizeof(char));
    
        fseek(datei,0,SEEK_SET);
    
        while(!feof(datei)){ //funktioniert nicht!!
            fgets(feldch,z1,datei);
          // sscanf(&zeichenfeld,"%d",feldch2[index]);
            sscanf(&zeichenfeld[index],"%d",feldch[index]);
            index++;
        }
    

    ich verzweifle langsam, hab schon wirklich alles mir bekannte ausprobiert, kann mirjemand eine Problemlösung vorschlagen!??!!?!??!!?!? 😕 😕

    ich hoffe ich kann auf euch zählen!

    Ich seh schon woran es liegt. Du verwendest sscanf() falsch, darum auch der Fehler vom Compiler. Dein sscanf() sollte so aussehen:

    ...
    sscanf(feldch, "%d", zeichenfeld+index);
    ...
    

    Zuerst kommt der String aus dem du was auslesen willst, dann dein Formatstring und danach die Variablen in denen formatiert gespeichert werden soll :).



  • es funktioniert, danke!!!

    Eines noch, ist es möglcih wenn ich ein unterprogramm habe und den sollte eigentlich ein wert übergeben werden, dieser funktion keinen Wert zu übergeben!??!!?!??!



  • max_88 schrieb:

    Eines noch, ist es möglcih wenn ich ein unterprogramm habe und den sollte eigentlich ein wert übergeben werden, dieser funktion keinen Wert zu übergeben!??!!?!??!

    Meinst du mit Unterprogramm ein separates Programm, dass du per system() aufrufst oder meinst du damit eine Funktion?



  • damit meine ich eine Funktion!

    Ach ja, noch etwas.... ich habe die zeichen der DAtei nun herausgelsesen, jedoch sind auch die Zeilenumbrüche mit in dem feld! bekommt man die irgendwie weg, oder ist das egal wenn man mit dem arbeitetd?!!?



  • max_88 schrieb:

    damit meine ich eine Funktion!

    Möglich wäre es schon, da müsstest du aber mit variablen Parametern arbeiten und das ist so ne Sache.

    Du könntest dir auch einen Dummy-Parameter-Wert ausdenken, wenn nötig.

    Warum muss eigentlich in dem einen Fall etwas übergeben werden und im anderen nicht? Vielleicht sollte man da mal ansetzen.

    max_88 schrieb:

    Ach ja, noch etwas.... ich habe die zeichen der DAtei nun herausgelsesen, jedoch sind auch die Zeilenumbrüche mit in dem feld! bekommt man die irgendwie weg, oder ist das egal wenn man mit dem arbeitetd?!!?

    Wegkriegen kannst du sie auf jeden Fall :). Ob sie stören, kommt darauf an, was du mit dem Inhalt machst.

    ...
    char *pos;
    ...
    //Ermittle die Position, an der in der eingelesenen Zeile der Zeilenumbruch steht.
    pos = strchr(zeile, '\n');
    //Wenn ein Zeilenumbruch gefunden wurde
    if(pos > 0)
    {
       //Ersetze den Zeilenumbruch durch das Stringendezeichen
       *pos = 0;
    }
    ...
    //---------------------------------------------------
    //Alternative
    ...
    unsigned int anz;
    ...
    //Anzahl der Zeichen in der eingelesenen Zeile ermitteln
    anz = strlen(zeile);
    //Prüfen, ob das letzte Zeichen ein Zeilenumbruch ist
    if(zeile[anz-1] == '\n')
    {
       //Ersetze den Zeilenumbruch durch das Stringendezeichen
       zeile[anz-1] = 0;
    }
    ...
    


  • ich beschreibs mal kurz:

    ich muss ein Projekt über Sortieralgorithmen machen (heap sort, insertion sort, ....) dabei muss ich die Daten aus ner Dateilesen die über die kommandozeile übergeben werden (wenn nicht in dem Programm). Wenn ich die Daten der Datei nun in das Feldgelesen habe, kann ich nun diese Feld direkt einem sortier- algorythmus übergeben!??!



  • max_88 schrieb:

    Wenn ich die Daten der Datei nun in das Feldgelesen habe, kann ich nun diese Feld direkt einem sortier- algorythmus übergeben!??!

    Das kommt darauf an, wie du das Feld (ich vermute mal Array) aufgebaut hast und welche Funktion(en) du als Sortier-Algorithmus verwendest.



  • also, ich nehme zb. insertion sort her... (algorithmus siehe pronix.de, einfach in die suche). Ich habe das Feld herausgelesen aus einer Datei:

    datei xxx.txt

    12
    4
    77
    2

    Ich hab sie nun herausgelesen, dabei aber auch die Zeilenumbrüche mit... funktioniert das so, oder muss ich die Zeilenumbrüche erst wegbekommen!?



  • hallo?? keiner da der mir weiterhilft?!?



  • nochetwas, habe probiert die ienzelnen zeichenfolgen mit einem printf herauszulsen:#

    for(a=0;a<=grosse;a++){
      printf("%s",zeichenfeld[a]);
      getch();
    }
    

    dabei wird mir mit jeder taste aber nur genau 1 zeichen ausgegeben, aber ich dachte ich hätte jede zeichenfolge(zb: 234 in einer Zeile) in das Feld zeichenfeldgespeichert, sodass ich durch : zeichenfeld[1] auf 234 zugreifen kann, und ich mit dem arbeiten kann!

    bitte helft mir...



  • max_88 schrieb:

    [C++ Error] machz.cpp(126): E2285 Could not find a match for 'sscanf(undefined,char *,char)'.

    printf("\n%d",z1);
        zeichenfeld=(char) malloc(z1*sizeof(char));
    
        
        }
    

    ich verzweifle langsam, hab schon wirklich alles mir bekannte ausprobiert, kann mirjemand eine Problemlösung vorschlagen!??!!?!??!!?!? 😕 😕

    ich hoffe ich kann auf euch zählen!

    kein Wunder, die benutzung von malloc ist zum Heulen. malloc liefert ein void* zuück, in C braucht man nicht zu casten, aber da du ja C++ benutzt (und trotzdem malloc benutzt, wo es new gibt), solltest du mit (char*) casten. sizeof(char) ist 1, also überflüssig. Außerdem überprüfst du nicht, ob malloc NULL zurückgeliefert hat.



  • das habe ich schon, nur nicht hier im angeführten prog. Troztdem wäre mir eine antwort auf die von mit vorher gestellte antwort sehr lieb!


Anmelden zum Antworten