Dateiverarbeitung und Array-Nutzung



  • Hallo!

    Leider benötige ich Hilfe beim Schreiben eines kleinen Programms. Dieses soll eine Textdatei (original.txt) einlesen, und die einzelnen Zeichen in ein Array schreiben. Dieses char-Array soll dann in ein int-Array umgewandelt werden, so dass jedem Zeichen des char-Array sein entsprechender int-Wert zugewiesen wird...
    Ich habe es mit fscanf probiert, aber so ganz klappt es leider nicht:

    FILE *datei;
    		char text[200];
    		int zaehler;
    
    		datei = fopen ("original.txt", "r");
    
    		if (datei != NULL)
    			{
    				fscanf (datei, "%200c", text);
    				/*printf ("%s\n", text);*/
    
    				fclose (datei);
    
    				 for (zaehler = 0; zaehler <= 199; ++zaehler)
    					printf ("%c-", text[zaehler]); 
    			}
    

    Meine Frage ist, wie ich die Textlänge dynamisch zuweisen kann (vllt. mit sizeof(datei) ?? ) und was dieses "%200c" in dem fscanf genau macht !?

    Danach soll das Array in eine andere Textdatei geschrieben

    /***************************************
    			Ausgabe crypt
    		***************************************/
    		FILE *datei2;
    		int zaehler2;
    		int textint[200];
    
    		datei2 = fopen ("crypt.txt", "w+");
    
    			for (zaehler2 = 0; zaehler2 <= 199; ++zaehler2)
    					fprintf (datei2, "%c", text[zaehler2]);
    					//fprintf ("--------");
    					fprintf (datei2, "%c", textint[zaehler2]);
    
    		fclose(datei2);
    

    das klappt leider irgendwie alles nicht... Habt ihr einen Tipp für mich?

    Danke und Gruß

    Christian



  • sntzz schrieb:

    die einzelnen Zeichen in ein Array schreiben. Dieses char-Array soll dann in ein int-Array umgewandelt werden, so dass jedem Zeichen des char-Array sein entsprechender int-Wert zugewiesen wird...

    also per

    for (zaehler=0;zaehler<200;zaehler++)
       if ((text[zaehler]=getc(datei))!=EOF)
           break;
    text[zaehler]=0;
    

    würde ich die werte einlesen. warum nicht fscanf? es ist nicht abgesichert UND es liest nur bis zur ersten leerzeile. die 200 steht übrigens dafür, dass nur 200 zeichen eingelesen werden, was es etwas sicherer macht. die schleife oben liest solange zeichen für zeichen ein bis 200 erreicht oder das ende der datei (EOF oder als ASCII wert -1) eingetreten ist. übrigens wenn du den ASCII wert zu der zahl willst einfach:

    zaehler=0;
    while (text[zaehler]!=0)
        printf("%d-",text[zaehler]);
    

    einfach als ausgabeformat integer statt char wählen denn jedes ASCII zeichen ist intern nur eine zahl. ausserdem kannst du den char variablen auch einfach int werte zuweisen, welche dann wiederum dem zeichen in der ascii tabelle entsprechen. hier die ASCII-Zeichentablle (30-130):

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        for (int i=30;i<130;i++)
            printf("*** %d: %c ***\t",i,i);
        system("pause");
    };
    

    in deinem fall ist also das int array gar nicht nötig.
    und noch was: wenn du den zaehler am anfang der for schleife wieder auf 0 setzt brauchst du dazu nich eine zweite variable. und hier noch eine funktion zum ermitteln der aktuellen position des dateizeigers innerhalb der datei

    int pos=ftell(datei);
    

    mit

    char *str=(char*) malloc(sizeof(ftell(datei)));
    

    kannst du dann auch dynamisch speicher reservieren für einen bestimmen teil innerhalb der datei.



  • Vielen Dank für deine Antwort. Die Sache mit "getc" leuchtet mir ein. Leider schaffe ich nicht, es zu implementieren... Hier ist der neue Quelltext:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void)
    	{
    
    		FILE *original;
    		char text[200];
    		int zaehler;
    
    		original = fopen ("original.txt", "r");
    
    		for (zaehler = 0; zaehler < 200; zaehler++) 
    			if ((text[zaehler]=getc(original))!=EOF) 
    				break; 
    		text[zaehler]=0;
    
    			while (text[zaehler] != 0) 
    				printf("%d-",text[zaehler]);
    
    	} //main ENDE
    

    Warum setzt du das text[zaehler] = 0 nach der for-Schleife? Und wo soll die folgende While-Schleife untergebracht werden? Leider verstehe ich den letzten Teil deines Posts auch nicht... Wofür ist denn der Pointer *str ?

    Ich lerne C erst seit ca. 2 Wochen, aber so schwer kann das doch nicht sein?
    Trotzdem Vielen Dank!!

    Gruß

    Christian


Anmelden zum Antworten