1.7k Aufrufe
Gefragt in Anwendungen(Java,C++...) von
Hey Leute,
ich komme bei dieser Aufgabe leider nicht weiter, ich möchte eine Datei einlesen die so aufgebaut ist

ab
hj
km
ol
pu


Also es stehen immer zwei Buchstaben in einer Zeile. Das einlesen habe ich bereits durch fgets realisiert, allerdings liest es mir - trotz überprüfung - immer zwei zeichen zu viel ein, egal wie viele Leerzeichen oder Zeilenumbrüche ich am ende einfüge! Eig. wollt eich den string jetzt einfach um 2 Stellen kürzen, da kam jedoch eine Fehlermeldung....

das wollte ich folgendermaßen machen:
laenge = (int)strlen(speichern);
printf("laenge:%i\n\n", laenge);
i=laenge--;
printf("laengexx:%i\n\n", i);

=>
Warnung: assignment makes integer from pointer without a cast



Deshalb überprüfe ich jetzt ob das eingelesene zeichen ein Buchstabe ist, also der char einen wert zwischen 65 und 90 bzw 97 und 122 für kleinbuchstaben hat. Wenn ich aber z. B. den unteren wert auf 70-90 einschränke und ein "A" eingebe, wird dieses nicht gefiltert!! => Meine if-bedingung stimmt nicht.... Ich finde jedoch keinen Fehler....
Hoffe ihr seid erfolgreicher ;-)

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

int main(void)
{
FILE *datei;
char einlesen [3], speichern[100];
int i=-1;
/* int ret; */
int laenge;

datei = fopen("test.txt","r");

if (!datei) {
printf("Fehler beim Öffnen der Datei! (Lesen)");
return 1;
}


while(fgets(einlesen, 100, datei) != NULL)
{
printf("einlesen:%s", einlesen);

if( ((einlesen[0] >68 && einlesen[0] < 91) || (einlesen[0] >96 && einlesen[0] < 123)) || ((einlesen[1] >=65 && einlesen[1] <= 90) || (einlesen[1] >=97 && einlesen[1] <= 122)) )
{ printf("xx %i", einlesen[0]); printf(" %i xx", einlesen[1]);
i++;
speichern[i]=einlesen[0];
i++;
speichern[i]=einlesen[1];
}else printf("Ihre Codetabelle ist nicht korrekt aufgebaut, bitte ueberpruefen!\n");
}



printf("\n\nspeichern: %s\nlaenge speichern: %d\n\n", speichern, strlen(speichern));

fclose(datei);
return 0;
}


Danke,
Grüße Didi

1 Antwort

0 Punkte
Beantwortet von son_quatsch Experte (5.3k Punkte)
Du prüfst auch lediglich, ob der erste Buchstabe im diesem Wertebereich liegt oder ob der zweite Buchstabe in jenem Wertebereich liegt. Deshalb ist ihm ein A als Erstbuchstabe egal, solang der zweite stimmt. Die "immer zwei Buchstaben zuviel" sind übrigens mit hoher Wahrscheinlichkeit der Windows-Zeilenumbruch, sprich CRLF, sprich 0x0d und 0x0a. Mach aus deinem oder ein und:

if(
(
( einlesen[0]> 68
&& einlesen[0]< 91
)
||
( einlesen[0]> 96
&& einlesen[0]< 123
)
)
&&
(
( einlesen[1]>= 65
&& einlesen[1]<= 90
)
||
( einlesen[1]>= 97
&& einlesen[1]<= 122
)
)
)
...