Kopieren einer Datei und Zählen der Worte



  • Hallo, ich habe die Aufgabe bekommen, einen Code zu ergänzen.
    Ziel ist es, die Materialnummern, aus der einen .txt Datei in eine andere zu kopieren, die Nummern zu zählen (und abzuändern).
    Mein Problem ist erstmal, die Nummern zu kopieren, da anscheinend nie EOF erreicht wird...
    Hier mein Code:

    #include<stdlib.h>
    #include<stdio.h>
    
    int copyMatNr(FILE * fin, FILE * fout)
    {
        char str[10];
        int s, counter = 0;
        int ipt, intgr = 0;
                                                                    //Ab hier habe ich ergänzt
        while (fscanf(fin,"%d",&ipt) != EOF)                          //Liest aus Datei und speichert in Variablen
            {   if(s = ' ')
                {
                    ++counter;                                        //Zählt Leerzeichen - Anzahl MatNummern
                }
                intgr = intgr+ipt;
            }
    
        fprintf(fout,"%d", intgr);
    
    return counter;                                                 //bis hier
    }
    
    int main(void)
    {
    
    FILE * fi = NULL, * fo = NULL;
    int anzahlMatNr;
    char inName [] = "material_in.txt ";
    char outName [] = "material_out.txt ";
                                                                    //ab hier
    fi = fopen("material_in.txt", "r");
    fo = fopen("material_out.txt", "w");
                                                                    //bis hier
    anzahlMatNr = copyMatNr(fi, fo);
    
    printf ("Datei %s enthaelt %d Materialnummern\n", inName, anzahlMatNr);
    
        fclose(fi);                                                 //Und fclose habe ich ergänzt
        fclose(fo);
    return 0;
    }
    

    Danke für potenzielle Hilfe. 🙂
    Gruß.



  • Was ich auf die schnelle gesehen habe:

    while (fscanf(fin,"%d",&ipt) != EOF) //Da die Zwahlen vermutlich mit whtiespace getrennt sind, musst du auch diese Whitespace irgendwie behandeln
            {   if(s = ' ') // s ist leer, im übrigen ist das eine Zuweisung kein Vergleich
                {
    


  • Und wie behandle ich den whitespace in

    while (fscanf(fin,"%d",&ipt) != EOF)
    

    ?



  • scanf überliest bei %d automatisch die Whitespace.
    Aber, wenn da keine Zahl steht, dann wird nichts² eingelesen und als Rückgabewert kommt 0. Die Schleife läuft weiter.

    ²Es wird ein Zeichen eingelesen und in den Eingabestrom zurückgestellt. Beim nächsten Aufruf von scanf bekommst du also wieder dieses Zeichen. -> Endlosschleife

    Bei der Ausgabe ( printf ) solltest du aber schon irgendwelche Trennzeichen mit einbauen.

    Was ist an den Leerzeichen wichtig, dass du die zählen willst?



  • Ich habe meine Funktion erstmal so umgebaut, dass sie mir die Anzahl der Worte ausgeben soll... aber nicht mal das tut sie. Es steht immer noch 0 da...
    Ich bin mit meinem Latein am Ende. 😕

    int copyMatNr(FILE * fin, FILE * fout)
    {
        char str[10];
        int counter = 0;
        int c=0,s;
                                                                    //Ab hier habe ich ergänzt
        while (1==fscanf(fin,"%d",str))
        {
            counter++;
        }
    
    return counter;                                                 //bis hier
    }
    


  • Durch die Leerzeichen wollte ich an die Wortzahl kommen.



  • %d (bei scanf ) ist zum einlesen von Ganzahlen zur Basis 10 da. Also für int .

    Du übergibst aber ein char* . Das sollte der Compiler auch mit einer Warnung anmeckern.²
    Für ein char* bzw C-String ist ein anderer Formatspecifier da.

    ² Wenn das nicht so ist, ändere den Warnlevel vom Compiler so, dass er es macht.



  • Habs geändert...
    Allerdings kommt das programm bei Ausführung nicht mal über fscanf hinaus.
    Der Wert von counter ändert sich nicht mal und er übermittels via return die 0.



  • HaloElite schrieb:

    Habs geändert...

    Was?

    HaloElite schrieb:

    Allerdings kommt das programm bei Ausführung nicht mal über fscanf hinaus.
    Der Wert von counter ändert sich nicht mal und er übermittels via return die 0.

    Der Code alleine macht ja auch nichts. Der Fehler kann auch in dem anderen Teil sein.

    Hast du mal fi auf gültigkeit überprüft? Hat das fopen funktioniert?



  • Und wenn du erstmal mit Dateioperatioen spielen willst, kannst du auch mal da http://www.cplusplus.com/reference/cstdio/fgetc/ nachschauen.



  • Ich bin wieder zu

    while (fscanf(fin, "%d", str) != EOF)
        {
            if(k == ' ')
            {
                counter++;
            }
    

    umgestiegen. Jetzt landet er in keiner Dauerschleife mehr.

    Wie überprüfe ich denn fopen auf Gültigkeit?



  • HaloElite schrieb:

    Ich bin wieder zu

    while (fscanf(fin, "%d", str) != EOF)
        {
            if(k == ' ')
            {
                counter++;
            }
    

    umgestiegen. Jetzt landet er in keiner Dauerschleife mehr.

    Das ist kompletter Blödsinn!

    HaloElite schrieb:

    Wie überprüfe ich denn fopen auf Gültigkeit?

    Hast du dir mal den Link ( von 16:12:57 09.05.2015) angeschaut?

    Du musst wissen was du tust, nicht raten.
    Dazu musst du dir mal die Dokumentation zu den Funktionen durchlesen (und verstehen).
    Die Beispiele dabei sind meist ganz hilfreich.


Anmelden zum Antworten