C Frage zu Verwendung von fscanf

dragonabllz

Ensign
Registriert
Mai 2011
Beiträge
254
Hi,

ich möchte aus einer .txt Datei Zahlen auslesen und ausgeben.
In der TextDatei steht sowas in der Art:
"78:89
89:1
usw..."
Also in jeder Zeile "Zahl:Zahl"!

Natürlich möchte ich auch Fehlerabfangen, wenn da z.b. statt "1:2" sowas wie "1:A" steht.

Ich habe es bislang so ausprobiert:
Code:
FILE *fp;
char *fn = "/cygdrive/c/Users/Hallo/Desktop/Neues_Textdokument.txt";

int test(){
	int anzahl, zahl, zahl2;
	if((fp = fopen(fn,"r+")) == NULL){
		fprintf(stderr,"Datei '%s' konnte nicht zum Lesen und Schreiben geöffnet werden!\n",fn);
		return 1;
	}
	if((anzahl = fscanf(fp,"%d:%d",&zahl,&zahl2)) == EOF){
		fprintf(stderr,"Konnte nicht aus '%s' lesen!\n",fn);
		return 2;
	}
	else
		if(anzahl == 0){
			fprintf(stderr,"Konnte keine Zahl aus '%s' lesen!\n",fn);
			return 3;
		}
	fclose(fp);
	printf("Die Zahl in der Datei '%s' lautet %d:%d",fn,zahl,zahl2);
	return 0;

}

Ich dachte wenn ich bei fscanf einfach ein "%d:%d" mache dann nimmt der keine Fehler an wie "1:A", also keine "Int:Char". Aber er macht es trotzdem und gibt irgendwelche großen Zahlen aus. Weshalb? Was kann ich da machen?
 
Bin zwar kein C Programmierer, aber wie wärs wenn du zuerst beides als String einliest und dann mittels einer .isInteger() Funktion überprüfst ob beide Eingaben Int-Zahlen sind und wenn ja sie danach konvertierst, wenn nein gibst du den Fehler aus.
 
Das könnte man auch machen, aber es gibt ja weitaus mehr Fehler die man in der Text Datei vorfinden könnte. Z.b. : "1: 33" oder "asdsd1:33" oder z.b. eine Zahl die größer ist als in Int reinpasst "1:1111111111111111111111111111" usw... dann müsste die "istint" Funktion recht aufwendig gebastelt werden oder nicht?
 
Gibts das nicht als vordefinierte Funktion in einer C-Bibliothek? Google mal ein bischen.
Oder noch billiger gehts wenn du die Strings mit ".toInt32()" (Achtung C#-Code) konvertierst, das in ein try-catch Konstrukt reinhaust und wenn er try schafft wars ne Zahl und bei catch wars halt keine gültige Zahl. Achtung: Schlechter Programmierstil!

Sorry aber ich kenn mich mit C-Programmierung wenig aus.
 
Theobald93 schrieb:
Oder noch billiger gehts wenn du die Strings mit ".toInt32()" (Achtung C#-Code) konvertierst, das in ein try-catch Konstrukt reinhaust und wenn er try schafft wars ne Zahl und bei catch wars halt keine gültige Zahl. Achtung: Schlechter Programmierstil!

Sorry aber ich kenn mich mit C-Programmierung wenig aus.
Sorry, aber warum antwortest du dann auf diese Frage? Es gibt in C kein try-catch Konstrukt! Und wenn du die Funktionen nicht kennst, dann sag doch einfach nichts. So verwirrst du den TO mehr, als das du ihm hilfst.

Und selbst in C# ist das deutlich einfacher, performanter, sicherer und mit deutlich weniger Code lösbar! Den Erfolg eines Casts mittels Exception zu prüfen, würde ich in C# einfach nur als "Krampf" bezeichenen, sorry! Da gibt es wesentlich einfachere Möglichkeiten ;-)


Wie Yuuri bereits richtig geantwortet hat, ist die Funktion "atoi" (was übrigens Ascii TO Integer heißt) dein Freund ;-)

Greetz
hroessler
 
Zurück
Oben