www.vorhilfe.de
- Förderverein -
Der Förderverein.

Gemeinnütziger Verein zur Finanzierung des Projekts Vorhilfe.de.
Hallo Gast!einloggen | registrieren ]
Startseite · Mitglieder · Impressum
Forenbaum
^ Forenbaum
Status VH e.V.
  Status Vereinsforum

Gezeigt werden alle Foren bis zur Tiefe 2

Navigation
 Startseite...
 Suchen
 Impressum
Das Projekt
Server und Internetanbindung werden durch Spenden finanziert.
Organisiert wird das Projekt von unserem Koordinatorenteam.
Hunderte Mitglieder helfen ehrenamtlich in unseren moderierten Foren.
Anbieter der Seite ist der gemeinnützige Verein "Vorhilfe.de e.V.".
Partnerseiten
Weitere Fächer:

Open Source FunktionenplotterFunkyPlot: Kostenloser und quelloffener Funktionenplotter für Linux und andere Betriebssysteme
Forum "C/C++" - EILT: Textdatei auslesen
EILT: Textdatei auslesen < C/C++ < Programmiersprachen < Praxis < Informatik < Vorhilfe
Ansicht: [ geschachtelt ] | ^ Forum "C/C++"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien

EILT: Textdatei auslesen: Fehlerhaftes auslesen
Status: (Frage) beantwortet Status 
Datum: 14:35 Fr 09.11.2007
Autor: Bacardix

Hi,
ich möchte eine Textdatei auslesen.
In der Datei steht ein 4-zeiliger Text:

Da steh ich nun,
ich armer Tor.
und bin so klug,
als wie zuvor!

Die Datei möchte ich auslesen und später auswerten.
Ich find leider den Fehler in meinem Programm nicht!
Er "verschluckt" die ersten beiden Buchstaben der Zeile 1 und gibt mir nur aus:
steh ich nun,
ich armer Tor.
und bin so klug,
als wie zuvor!

Hier mein Programm:
#include <stdio.h>


int main(void)
{
  FILE *fp1;
  int x=0,i=0;
  char string1[17],zeichen;
  printf("Zeichen:");
  scanf("%c",&zeichen);
  fp1=fopen("test.txt","r");
  fscanf(fp1,"%s",&string1);

   while(fgets(string1,17,fp1)!=0)
      {
          printf("%s",string1);      
          for(i=0;i<17;i++)
          {x+=(string1[i]==zeichen);}
      }
    
   [mm] printf("%d\n",x); [/mm]  
  system("PAUSE");
  return 0;
}
Wäre nett wenn mir das jmd beantworten könnte.

ein zweites Problem ist, dass ich einen bestimmten Buchstaben zählen möchte.
Ich lese den zu zählenden Buchstaben am Anfang des Programms ein und werte den string am ende der schleife einfach nur aus. Sollte der Buchstabe im string gefunden werden soll x inkrementiert werden.
Jedoch gibt er mir auch die anzahl der gefundenen Buchstaben fehlerhaft aus.
Wo liegt der Fehler?


Lg Bacardix


        
Bezug
EILT: Textdatei auslesen: Antwort
Status: (Antwort) fertig Status 
Datum: 18:16 Fr 09.11.2007
Autor: Martin243

Hallo,

da sind zwei Fehler:
1. In der Zeile
fscanf(fp1,"%s",&string1);
übergibst du eine Referenz auf einen Pointer. Das ist doppelt gemoppelt. Es müsste heißen:
fscanf(fp1,"%s", string1);

2. Was willst du überhaupt mit dieser Zeile? Lass sie weg und alles funktioniert.


Gruß
Martin

Bezug
                
Bezug
EILT: Textdatei auslesen: Frage (beantwortet)
Status: (Frage) beantwortet Status 
Datum: 18:27 Fr 09.11.2007
Autor: Bacardix

Supi...ja hast recht die Zeile war sinnlos!
Jetzt habe ich aber noch ein Problem mit den Buchstaben zählen!
Er gibt mir bei keinem Buchstaben die richtige anzahl aus!
Meistens ist der Wert um 1 höher.
Aber beim Buchstaben "e" zum Beispiel ist x=6 obwohl nur 3 e's drin sind!???

Bezug
                        
Bezug
EILT: Textdatei auslesen: Antwort
Status: (Antwort) fertig Status 
Datum: 19:00 Fr 09.11.2007
Autor: Martin243

Ach ja!
Schauen wir uns deine Einlese- und Auswertungschleifen an:

   while(fgets(string1,17,fp1)!=0)  //Wir lesen einen String unbekannter Länge ein
      {
          printf("%s",string1);      
          for(i=0;i<17;i++)  //Hier gehen wir von einem 17 Zeichen langen String aus
          {x+=(string1[i]==zeichen);}
      }

Wenn der neue String kürzer ist als der alte, dann bleiben noch die alten Buchstaben im Speicher. Da du aber immer alle 17 auswertest, geht es in die Hose. Also: Auf terminierende Null achten!

Was mich erstaunt: Ich bekomme nicht 6 sondern 4 es.


Gruß
Martin

Bezug
                                
Bezug
EILT: Textdatei auslesen: Frage (beantwortet)
Status: (Frage) beantwortet Status 
Datum: 19:56 Fr 09.11.2007
Autor: Bacardix

mmmhhh komisch. Also irgendwie bekomme ich auch nach jeder zeile immer doppelt angezeigt wieviele zeichen in der zeile sind, obwohl ich den befehl nur 1 mal aufrufe!
Jede Zeile hat 16 Zeichen...gebe ich also ein:
for (i=0;i<16;i++) stimmt es immernoch nicht!
Ich weiß das am Ende jeder zeile eine "0" kommt (deswegen meine 17 Zeichen). Wie kann ich denn vorgeben das die for-Schleife nach der 0 aufhören soll? ich habs mit i==0 probiert. Geht aber nicht!

Sorry bin noch nicht ganz so c-erfahren!

Bezug
                                        
Bezug
EILT: Textdatei auslesen: Antwort
Status: (Antwort) fertig Status 
Datum: 23:02 Fr 09.11.2007
Autor: Martin243

Hallo,

> Sorry bin noch nicht ganz so c-erfahren!

Macht nix! Du gibst dein Bestes.


> Jede Zeile hat 16 Zeichen...

Echt? Zähl nach.


Ich habe mir das mal genauer angesehen und festgestellt:
1. Bei einigen Zeilen steht noch ein Leerzeichen am Ende, also bis zu 17 Zeichen!
2. Das newline ist da noch gar nicht mitgezählt!
3. Es wird sechsmal eingelesen: Erste Zeile, Rest der ersten Zeile, zweite Zeile, dritte Zeile, Rest der dritten Zeile, vierte Zeile.

Eine Soforthilfemaßnahme wäre direkt zu Beginn der for-Schleife:
if (!string1[i]) break;

Sauberer würde es allerdings, wenn du zeichenweise einlesen würdest.
Oder aber du nimmst den Code mit der Korrektur von oben und legst ihn für ein paar Zeichen mehr aus, also z.B. für 20. Dann passiert das mehrfache Lesen nicht mehr.


Gruß
Martin

Bezug
                                                
Bezug
EILT: Textdatei auslesen: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 00:13 Sa 10.11.2007
Autor: Bacardix

Super Martin...so gehts!
Vielen Dank.
Die eigentliche Aufgabe war es den Text zeilenweise auszugeben, zeilenweise einen bestimmten Buchstaben zu zählen und am Ende die Gesamtanzahl des Buchstabens im Text auszugeben! Das habe ich jetzt mit deiner Hilfe, und sogar ziemlich kurz und knapp (hätten es auch ohne schleifen machen können, so dass das Programm sehr lang wird) geschafft.

Vielen Dank für deine Hilfe!

Bezug
Ansicht: [ geschachtelt ] | ^ Forum "C/C++"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien


^ Seitenanfang ^
ev.vorhilfe.de
[ Startseite | Mitglieder | Impressum ]