Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Problem beim Datei string vergleichen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
07.07.2015, 23:06 Uhr
Bolle



moin Leute

Gleich zur Sache:

Sinn des Programms soll sein das die Wörter die eingegeben werden in
Der Datei gesucht werden. Wenn sie nicht existieren wird das Wort am Ende
drangehängt.


Ich finde nicht heraus in welchem Fall erkannt wird, das das
Wort existiert und wann nicht

Es erscheint mir willkürlich, ich finde es einfach nicht raus.

Ich würde mich freuen wenn mir jemand meinen Fehler erklärt.


C++:



#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include <stdbool.h>

#define MAX 50                                    //maximale größe des Eingabestrings und maximale chars pro reihe in datei
#define DATEINAME "Datenbank.txt"            ///später txt wegnehmen

int teste_wort(char string[]){
    FILE *datei;
    datei = fopen(DATEINAME, "rt");
    if(datei == NULL)
            fprintf(stderr, "Datei %s konnte nicht geöffnet / bearbeitet werden.", DATEINAME);
char     pos_char,    string_reihe[MAX] = { 0 };
int     reihe = 0,    pos_buchstabe = 0;    /*  reihe wird  nicht verwendet, kann später kommen  */
bool    wort_existent = false;
    while ( ( pos_char = fgetc ( datei ) ) != EOF ){
        string_reihe[pos_buchstabe] = pos_char;
        pos_buchstabe++;
        if ( pos_char == '\n' ){
            string_reihe[strlen(string_reihe) -1 ] = '\0';            
            if( strcmp( string, string_reihe ) == NULL ){
                wort_existent = true;
                break;
            }
            reihe++;
            pos_buchstabe=0;
        }
    }
    fclose(datei);
    return wort_existent;
}
int in_datei_schreiben(char string[]){        ///wort wird ans ende der datei gespeichert
    FILE *datei;
    datei = fopen(DATEINAME, "a");
    if(datei == NULL)
            fprintf(stderr, "Datei %s konnte nicht geöffnet / bearbeitet werden.", DATEINAME);
    fprintf(datei, string);
    fprintf(datei, "\n");
    fclose(datei);
}
void eingabe()                                //eingabe wird formatiert und an in_datei_schreiben übergeben
{
    printf("Text eingeben : ");
char eingabestr[MAX] = { 0 };
    fgets(eingabestr, MAX, stdin);
int anz = 0, eing_stringPosition = 0;
char tempwort[MAX] = { 0 };
    for(int pos=0; pos < strlen(eingabestr)-1; pos++){        //string einlesen und einzelne wörter weiterleiten
        tempwort[eing_stringPosition] = eingabestr[pos];
        eing_stringPosition++;
        if(eingabestr[pos] == ' ' || eingabestr[pos] == '\0'){
            if( teste_wort(tempwort) == false ){            // ein wort
                in_datei_schreiben(tempwort);
                printf("%s existiert noch nicht\n", tempwort);
            }
            anz++;
            eing_stringPosition=0;
            for(int i=0; i < strlen(tempwort); i++)
                tempwort[i] = ' ';
        }
    }
    if( teste_wort(tempwort) == false ){
        in_datei_schreiben(tempwort);
        printf("%s existiert noch nicht\n", tempwort);
    }
}
int main()
{
    eingabe();    
    return 0;
}


Dieser Post wurde am 07.07.2015 um 23:12 Uhr von Bolle editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.07.2015, 23:21 Uhr
Hans
Library Walker
(Operator)


Hi,

hast Du schon mal versucht, den Fehler mit einem Debugger aufzuspüren?
Ansonsten wäre es gut, wenn Du eine Wortliste mitliefern würdest, anhand derer man versuchen kann, das Problem nachzuvollziehen.

Hans


P.S. Dann hab ich hier mal eine neu formatierte Version Deines Quelltextes, wo ich auch ein paar Änderungen dran vorgenommen habe. U.a. hab ich Variablendefinitionen an den Anfang gestellt, weil mein derzeitiger Compiler es nicht anders mag.

C++:
/////////////////////////////////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <stdbool.h>

#define MAX 50                               //maximale größe des Eingabestrings und maximale chars pro reihe in datei
#define DATEINAME "Datenbank.txt"            //später txt wegnehmen


int teste_wort(char string[])
{
    FILE *datei;
    char pos_char, string_reihe[MAX] = { 0 };
    int  reihe = 0, pos_buchstabe = 0;    /*  reihe wird  nicht verwendet, kann später kommen  */
    bool wort_existent = false;
    
    datei = fopen(DATEINAME, "rt");
    if (datei == NULL)
      { fprintf(stderr, "Datei %s konnte nicht geöffnet / bearbeitet werden.", DATEINAME);
        exit(1); // Programmabbruch eingebaut, sonst läuft es nach Ausgabe der Fehlermeldung weiter.
      }  
        
    while ( ( pos_char = fgetc ( datei ) ) != EOF )
        {
            string_reihe[pos_buchstabe] = pos_char;
            pos_buchstabe++;
            if ( pos_char == '\n' )
                {
                    string_reihe[strlen(string_reihe) -1 ] = '\0';
                    if( strcmp( string, string_reihe ) == NULL )
                        {
                            wort_existent = true;
                            break;
                        }
                    reihe++;
                    pos_buchstabe=0;
                }
        }
    fclose(datei);
    return wort_existent;
}


int in_datei_schreiben(char string[])         // wort wird ans ende der datei gespeichert
{
    FILE *datei;
    datei = fopen(DATEINAME, "a");
    if(datei == NULL)
        fprintf(stderr, "Datei %s konnte nicht geöffnet / bearbeitet werden.", DATEINAME);
    fprintf(datei, string);
    fprintf(datei, "\n");
    fclose(datei);
}


void eingabe()                                //eingabe wird formatiert und an in_datei_schreiben übergeben
{
    char eingabestr[MAX] = { 0 };
    int anz = 0, eing_stringPosition = 0;
    char tempwort[MAX] = { 0 };
    
    printf("Text eingeben : ");
    fgets(eingabestr, MAX, stdin);
    for(int pos=0; pos < strlen(eingabestr)-1; pos++)         //string einlesen und einzelne wörter weiterleiten
        {
            tempwort[eing_stringPosition] = eingabestr[pos];
            eing_stringPosition++;
            if(eingabestr[pos] == ' ' || eingabestr[pos] == '\0')
                {
                    if( teste_wort(tempwort) == false )             // ein wort
                        {
                            in_datei_schreiben(tempwort);
                            printf("%s existiert noch nicht\n", tempwort);
                        }
                    anz++;
                    eing_stringPosition=0;
                    for(int i=0; i < strlen(tempwort); i++)
                        tempwort[i] = ' ';
                }
        }
    if( teste_wort(tempwort) == false )
        {
            in_datei_schreiben(tempwort);
            printf("%s existiert noch nicht\n", tempwort);
        }
}
int main()
{
    eingabe();
    return 0;
}


--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 08.07.2015 um 23:27 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
09.07.2015, 13:18 Uhr
ao

(Operator)


Es ist keine gute Idee, zeichenweise auf Dateien herumzuturnen. Manchmal muss man das, weil es nicht anders geht, aber das scheint mir hier nicht der Fall zu sein. Viel zu leicht verirrt man sich dabei, und das ist wahrscheinlich auch der Grund, weshalb du deine Wörter nicht wiederfindest.

Das da oben ist mit Verlaub übler Spaghetticode, der in die Tonne gehört, und ich werde den nicht debuggen.

Machs nochmal von vorn, und bevor du anfängst zu programmieren, überlegt dir ein paar sinnvolle Konventionen wie z.B.: "Die Datei ist eine Wortliste. Jedes Suchwort steht auf einer eigenen Zeile." Und dann nutz das aus, indem du (z.B. mit fgets) ein ganzes Suchwort auf einen Rutsch in den Speicher holst.

Und musst du das in C machen? In C++ gibts eine string-Klasse, die das Suchen und Vergleichen ganz erheblich vereinfacht. Und für die Dateizugriffe wäre iostream zu empfehlen.

Dieser Post wurde am 09.07.2015 um 13:19 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
13.07.2015, 13:31 Uhr
Bolle



Danke für die hilfe ich hab die Fehler mittlerweile gefunden.

Ich lern im Moment noch c und weil ich da mit Dateien und string.h
Defizite hab hab ich mir die Aufgabe so gesteckt.

Die Datei ist so aufgebaut das nur ein Wort pro Reihe steht

Fgets hab ich ehrlich gesagt gedanklich nicht umsetzen können
Ich wusste nicht wie ich fgets mit dem filepointer kombinier.

Wie würdest Du den Spagetticode etwas entwirren? Nur so grob beschrieben
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
13.07.2015, 15:44 Uhr
Hans
Library Walker
(Operator)


Hi,

Zitat:
Fgets hab ich ehrlich gesagt gedanklich nicht umsetzen können
Ich wusste nicht wie ich fgets mit dem filepointer kombinier.


gibt es denn bei Deinem verwendeten Compiler kein Beispiel für die Verwendung von fgets()?
Das würde mich ehrlich gesagt sehr wundern. Egal, hier mal eine modifiziertes Version des Beispiels vom Open Watcom Compiler:

C++:
#include <stdio.h>

void main()
{
    FILE *fp;
    char buffer[80], *success;

    fp = fopen( "file", "r" );
    if( fp != NULL )
    {
      do
      {  success = fgets( buffer, 80, fp );
         if( success == NULL )
            break;
         fputs( buffer, stdout );  
      }  
      while( success != NULL );
        
      fclose( fp );
    }
}


Das Beispiel zeigt, wie man fgets() verwendet, die Datei "file" sollte vorher vorhanden sein, dafür kannst Du aber auch Deine "Datenbank.txt" verwenden.


Zitat:
Wie würdest Du den Spagetticode etwas entwirren? Nur so grob beschrieben

Als erstes würde ich den vorhandenen Code beiseite legen und ein Flussdiagramm erstellen, dass den logischen Ablauf darstellt, wie das Programm funktionieren soll. Anschliessend würde ich nach diesem Diagramm komplett neu codieren. Alternativ kann man auch Struktogramme verwenden. Ich ziehe Flussdiagramme vor, aber es ist letztlich eine Geschmacksfrage, bzw. die Frage danach, womit man besser klar kommt.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 13.07.2015 um 15:56 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
13.07.2015, 18:17 Uhr
Bolle



Danke, ich sollte wohl mehr Fokus auf die Vorbereitung setzen

Ich versuch es nochmal von Anfang an mit pap

Ich benutze codeblocks, hab allerdings nur mit Handy-drossel-Leitung
Internet. Nicht am pc, deswegen kann ich All die tollen Features nicht nutzen
Ich hab nur das was im header steht und tuts
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
15.07.2015, 09:31 Uhr
ao

(Operator)



Zitat von Bolle:
Danke, ich sollte wohl mehr Fokus auf die Vorbereitung setzen

Ja, zum Beispiel könntest du vorbereitend die Datei einmal einlesen und in Wörter zerlegen und diese in einem String-Array speichern. Dann könntest du in teste_wort auf das String-Array zugreifen und nicht jedesmal von neuem auf den Datei-Inhalt.

Einen messbaren Geschwindigkeitsvorteil zur Laufzeit wird dir das nicht bringen (dank mehrlagigem Cache werden die Daten so oder so nicht jedesmal von der Platte geholt), aber dein Programm wird entflochten.

Und nochmal die Frage, warum lernst du ausgerechnet C und nicht gleich C++? Musst du das?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
15.07.2015, 11:21 Uhr
Bolle



Ich hatte zu begin noch mehr Neigung in Richtung Hardware, ic's und so.
Hab mit der Zeit umgeschwenkt zur Software, da war ich mitten in c lernen.
Dann dachte ich mir zieh ich das erstmal durch.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
16.07.2015, 12:16 Uhr
ao

(Operator)


Ach so, OK.

Aber auch in C gilt: Speicher ist eine Resource, die eingesetzt werden sollte, wenn sie schon zur Verfügung steht. Man kann auf Daten, die im Speicher liegen, 100mal flexibler und sicherer arbeiten als auf Daten, die Byte für Byte aus irgendeinem Device (Datei, Schnittstelle, wasauchimmer) gequetscht werden müssen.

Einfacher, lesbarer Code, das ist in 98 Prozent der Anwendungsfälle das wichtigste Qualitätskriterium. Und fast immer ist der einfachere Code auch der schnellere. Ob du ein paar hundert Kilobytes RAM brauchst oder nicht, das interessiert dagegen in der Regel kein Schwein.

Nur auf kleinen Mikrocontrollern, wo RAM knapp ist, kann das anders sein. Aber das wird mehr und mehr zur Nische, und man sollte sich nicht angewöhnen, immer so zu programmieren als hätte man nur ein paar Bytes Speicher zur Verfügung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: