Array, und Zahlen aus Dateien



  • Hallo, ich brauche mal eure Hilfe. Ich muss ein Programm schreiben, dass nur Zahlen aus Dateien einliest und die dann hübsch in ein array verpackt. Die Zahlenauswertung soll über die Ascii Folge passieren, leider habe ich keine Ahnung wie ich das machen soll und das größere Problem ist, wie ich aus vernünftig aus Zeichenweise aus einer Datei lese.Hilfe wäre ich sehr Dankbar.



  • zeilenweise aus dateien lesen geht mit fgets.

    eine positive ganzzahl kannst du aus einem string von dezimalziffern konstruieren:
    char ziffer = '7'; // beliebig
    int wert = ziffer - '0';

    damit gehst du den string entlang und addierst alle so berechneten stellenwerte.
    (tipp: nummer = nummer*10 + stellenwert)



  • Danke erstmal. Gibt es noch eine andere Funktion als fgets ?? Die dürfen wir nicht benutzen und eine möglichkeit das ich es nicht erst in eine char Variable verweise ?



  • hm, dann musst du wohl oder uebel mit fscanf die zahlen lesen. probier mal als formatstring "%s" und in der datei dann mit whitespace abgetrennte zahlen. die musst du dann (nach aufgabenstellung) aber noch selber von string nach ganzzahl umwandeln.



  • Kann man da nicht mit fgetc arbeiten ?



  • c.rackwitz schrieb:

    hm, dann musst du wohl oder uebel mit fscanf die zahlen lesen. probier mal als formatstring "%s" und in der datei dann mit whitespace abgetrennte zahlen.

    das ist aber nicht zeichenweise - zeichenweise bekommst du mit "%1s" bzw. "%c".



  • Bekomme ich Zeichenweise nicht auch irgendwie mit getchar ? Das Proble ist das wir strenge richtlinien haben. Wie sieht denn überhaupt der code aus um zeichen für zeichen zu lesen und dann gucken ob es eine Zahl ist.. Ich komme nämlihc nicht weiter hier



  • Klar, wenn du nur von Tastatur einlesen willst, reicht getchar(). Ansonsten benötigst du eine FILE*-Eingaberoutine (welche sind denn erlaubt?):

    while(!feof(file))
    {
      char c=fgetc(file);
      if(!isdigit(c) break;
      //arbeite mit c (bzw. c-'0')
    ]
    


  • also fgetc und fscanf sind erlaubt.



  • Zeichen lesen geht mit beiden Möglichkeiten:

    //a: fgetc():
    int res=fgetc(file);
    if(res==EOF) break;//End Of File
    char ch=res;
    
    //b: fscanf():
    char ch;
    int res=fscanf(file,"%c",&ch);
    if(res==EOF) break;
    

    (die if(res==EOF)-Abfrage dient jeweils zur Kontrolle, ob das Dateiende erreicht wurde)

    Zum Überprüfen auf Ziffer gibt es erstens die Funktion isdigit() (sofern erlaubt) und zweitens die Per-Hand-Abfrage "if(ch>='0'&&ch<='9')...".



  • Kann ich das denn so verpacken ?

    while((res = fgetc(FILE)) != EOF)
    {
       if(res >='0' && res <='9')
       {
          ...
       }
    
    }
    


  • ja, kannst du - eventuell würde ich noch ein "else break;" reinpacken - sonst erkennst du z.B. "123A17" al 12317.



  • Habe das nun so, funktioniert aber noch nicht. Das Programm stürzt dabei ab.

    #include <stdio.h>
    
    int main()
    {
    	FILE *fp;
    	int zf[100];
    	char fname[20], c, i = 0;
    	printf("\nDateiname eingeben: ");
    	while((c = getchar()) != '\n')
    		fname[i++] = c;
    	fname[i] = '\0';
    	i = 0;
    	fp = fopen(fname, "r");
    	if (fp != NULL)
    	{
    		while ((c = fgetc(fp)) != EOF)
    		{
    			if (c >= '0' && c <= '9')
    			{
    				zf[i++] = (int)c;
    			}
    			else
    				printf("\nBuchstabe %s erkannt!", c);
    		}
    	}
    	else
    		printf("\nDatei konnte nicht gefunden werden");
    
    	return 0;
    }
    


  • Du solltest c als int deklarieren, sonst klappt der Vergleich auf EOF nicht richtig (EOF ist ein spezieller Rückgabewert außerhalb des Zahlenbereiches für char's, deshalb liefert fgetc() auch int zurück).



  • ok, hab ich, jedoch stürzt das Programm ab, sobald er in der Datei über einen Buchstaben stolpert. Hab den Fehler gerade gefunden, jedoch gibt er mir den Buchtaben dann als Zahl aus wenn ich beim letzten else Zweig %s in %i ändere.



  • Jetzt soll ich die Werte allerdings in float einlesen. Das funktioniert bei mir irgendwie nicht



  • Wenn du das wirklich zeichenweise auslesen sollst, wünsche ich dir viel Spaß beim Zusammenbau des Wertes. Aber du kannst auch direkt in einen float einlesen:

    float data;
    fscanf(file,"%f",&data);
    

    PS: Schau dir mal die Dokumentation zu man: fscanf an - dort gibt es auch eine Liste, welche Format-Spzifikationen unterstützt werden (und was sie bewirken).


Anmelden zum Antworten