EILT: Textdatei auslesen < C/C++ < Programmiersprachen < Praxis < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | 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
|
|
|
|
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
|
|
|
|
|
Status: |
(Frage) beantwortet | 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!???
|
|
|
|
|
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
|
|
|
|
|
Status: |
(Frage) beantwortet | 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!
|
|
|
|
|
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
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | 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!
|
|
|
|