1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

C-Probleme

    • Frage
  • pendragon
  • 18. Januar 2004 um 18:48
  • Unerledigt
  • pendragon
    2
    pendragon
    Mitglied
    Punkte
    15
    Beiträge
    2
    • 18. Januar 2004 um 18:48
    • #1

    Hallo!

    Bin Anfänger in der C-Programmierung und bräuchte da ein wenig Hilfe. Habe mir ein Programm geschrieben, mit dem ich zeichenweise aus einer Textdatei einlesen kann. Anschließend prüfe ich, wieviele Wörter da drinnen sind.

    Jetzt sollte ich es nur noch zusammenbringe, dass ich mir die mittlere Wortlänge ausrechne bzw. die absolute und relative Häufigkeit jedes Buchstabens ermittle. Klinge ja nicht so schwer, aber ich schaffe es nicht. Problem ist wohl, dass ich mir die Wörter nur durch True or False ermittelt habe.

    Wie kann ich von, wenn ich mittels fgetc gelesen habe, mir das ganze in eine String reinholen? Dann wären Prüfabfragen wohl einfacher...

    Vielleicht kann mir wer helfen...

    Pendragon

  • hal
    32
    hal
    Mitglied
    Reaktionen
    52
    Punkte
    11.122
    Beiträge
    2.208
    • 19. Januar 2004 um 04:22
    • #2

    für die wortlänge brauchst ja nur einen counter mitlaufen lassen, der immer resettet wird, wenn ein nicht-buchstabe kommt (und den alten wert irgendwo zwischenspeichert). für die buchstabenhäufigkeit reicht ein feld, in dems für jeden buchstaben einen eintrag gibt (also 255 Zeichen groß für ASCII), und dann dieser wert um eins erhöht wird, wenn der buchstabe auftritt:

    Code
    unsigned auftretzahl[255];
    
    
    while(...) {
    char c=fgetc(stdin);
    auftretzahl[c]++;
    }

    (auf 0 initialisieren nicht vergessen!)

    [font=verdana,sans-serif]"An über-programmer is likely to be someone who stares quietly into space and then says 'Hmm. I think I've seen something like this before.'" -- John D. Cock[/font]

    opentu.net - freier, unzensierter Informationsaustausch via IRC-Channel!
    Hilfe und Support in Studienangelegenheiten, gemütliches Beisammensein, von und mit Leuten aus dem Informatik-Forum!

  • marX
    7
    marX
    Mitglied
    Reaktionen
    10
    Punkte
    460
    Beiträge
    88
    • 19. Januar 2004 um 20:56
    • #3

    was hal geschrieben hat ist natürlich die einfachste methode....
    wenn du aber wirklich den inhalt des files speichern willst:

    Code
    FILE *fp; // File Pointer
       int fsize; // Dateigröße
       char *fbuffer; // File-Buffer
    
    
       fp = fopen("xyz.dat", "rb"); // Öffnen der Datei -> Lesen+Binary
       if (fp == NULL) // Fehler beim Öffnen ?!!
       { // -> JA
          printf("ERROR: Unable to open file xyz.dat!");
          return ;
       }
    
    
       // Ermitteln der Dateigröße -> ist ein SCHEISS-verfahren...aber ich mache
       // das schon lange so...funzt gut und ich bin zu fault um den befehl 
       // nachzusehen ;)
       fsize = 0; // Dateigröße=0
       while (fgetc(fp) != EOF) // Solange nicht am Dateiende ->
          fsize++; // "Dateigröße" erhöhen
       fseek(fp, 0, SEEK_SET); // Wieder zum Datei-Anfang springen
    
    
       fbuffer = (char *)malloc(fsize+1); // Speicher belegen
       if (fbuffer == NULL) // Speicher bekommen ?!!
       { // Nein!!!
          fclose(fp); // Datei wieder schließen!!!
          printf("ERROR: Low Memory! Unable to Cache xyz.dat.");
          return ;
       }
    
    
       fread(fbuffer, fsize, 1, fp); // Datei in den Buffer lesen
       fbuffer[fsize] = '\0'; // Am Datei-ende mit 0 abschließen
       fclose(fp); // und Datei schließen
    
    
       // .......
    
    
       // Am ende muss der Speicher mit free((void *)fbuffer); freigegeben werden!!!!
    Alles anzeigen

    so funzt das gut...du kannst dann auf jedes zeichen ganz einfach wie in einem arry (feld) zugreifen -> fbuffer[0] = 1. Zeichen, fbuffer[1] = 2.Zeichen, .... das Feld wir mit '\0' beendet

    -> am ende speicher freigeben nicht vergessen!!!
    -> die methode um die dateigröße zu ermitteln ist "etwas" gammlig, aber sie funktioniert gut und ich war immer zu faul um die funktion zu verwenden...;)

    mfg marX

  • Primenumber
    11
    Primenumber
    Mitglied
    Reaktionen
    2
    Punkte
    1.122
    Beiträge
    218
    • 20. Januar 2004 um 00:19
    • #4

    Ouch :winking_face:

    fseek(fp, 0, SEEK_END);
    fsize = ftell(fp);

    wäre zumindest mit den stdio funktionen ein _wenig_ schneller

  • marX
    7
    marX
    Mitglied
    Reaktionen
    10
    Punkte
    460
    Beiträge
    88
    • 20. Januar 2004 um 18:37
    • #5

    ...hab ja gesagt, dass das nicht schön ist, aber faulheit ist das schlimmste übel :winking_face: (langsam ist's normalerweise aber nicht ;))

    na ja....gibt ja auch eine routine um die dateigröße abzufragen.....

  • pendragon
    2
    pendragon
    Mitglied
    Punkte
    15
    Beiträge
    2
    • 25. Januar 2004 um 20:00
    • #6

    Hallo und danke für eure Antworten!!! Mit dem geschriebenen Code konnte ich das dann endlich bewerkstelligen!!!

  • Maximilian Rupp 27. Dezember 2024 um 12:08

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Rechtliches

Impressum

Datenschutzerklärung