Datei zeilenweise auslesen



  • Hallo.

    Ich versuche schon die ganze Zeit eine Datei zeilenweise auszulesen. Habe jetzt eine Weile bei Google gesucht und mit der Hilfe einen halbwegs funktionierenden Code als blutiger C-Anfänger zusammen bekommen :). Ziel ist es, eine Datei mit folgender Struktur einzulesen:

    addi $t1,$zero,100
    addi $a0,$a0,1
    addi $v0,$zero,1
    syscall
    beq $a0,$t1,7
    j 1
    addi $v0,$zero,10
    syscall
    

    Diese Zeilen sollen zunächst in folgendes Array gespeichert werden (code):

    struct programm {
    	int pc;
    	int reg[32];
    	char code[128][80];
    	char stack[256];
    	char name[32];
    	char active; /* false wenn Programm beendet */
    } p1;
    

    So hier mal der Code:

    int main(int c, char **v) {
    	int i = read();
    	return i;
    }
    
    int read() {
    	char *dateiname = "counter.asm";
    	FILE *datei;
    	int codeCounter = 0;
    	datei = fopen(dateiname, "r");
    	if(datei == NULL) {
    		printf("Datei konnte nicht geoeffnet werden.\n");
    		return 0;
    	}
    	while (!feof(datei)) {
    		fscanf(datei, "%s", p1.code[codeCounter]);
    		printf("%s\n", p1.code[codeCounter]);
    		codeCounter++;
    	}
    	fclose(datei);
    	return 1;
    
    }
    

    Das Problem ist klar, er liest zB "addi t1,t1,zero,100" als zwei Strings ein. Ich habe allerdings keine Ahnung wie man das als 1 String behandeln kann?! Schon mal danke für die Hilfe.



  • mit fgets() bekommst du eine zeile die du dann abarbeiten kannst, mir fällt spontan nicht ein wie man das sauber mit einem aufruf totschlagen kann, da du ja sicher variable parameter anzahlen hast, die du auch testen willst...



  • Hi,

    mikemodanoxxx schrieb:

    Hallo.
    ....
    Ich habe allerdings keine Ahnung wie man das als 1 String behandeln kann?! Schon mal danke für die Hilfe.

    indem du dafür sorgst, das "addi t1,t1,zero,100" als eine Zeile erkannt wird, z.B. indem du es mit einem '\n' (newline) Zeichen bereicherst:
    "addi t1,t1,zero,100\n"
    Die Funktion fgets liest nämlich bis zum newline ein, oder bis zu sizeof(p1.code[codeCounter])-1 Bytes.



  • Ich darf die Datei nicht verändern. Das ist vorgegebener Assembler-Code. Ist aber auch nicht so wichtig, denn mit noobLolos Tipp hat alles funktioniert.

    Habe noch eine Frage, die mit dem Thema nichts zu tun hat. Ich habe eine andere Übungsaufgabe, bei der ich zwei Strings vergleichen muss. Dazu sollen die zwei Strings von außen an die main-Methode übergeben werden.

    Ich habe allerdings festgestellt, dass Eclipse als erstes Argument automatisch den Pfad der Datei übergibt und ich somit die Argumente nur an Position 2 und 3 übergeben kann. Ist das immer so? Mit "blabla.exe string1 string2" übergibt er nämlich auch als erstes Argument den Dateinamen. In der Aufgabe wird nämlich eigentlich gefordert, dass exakt 2 Argumente erwartet werden.

    ciao, Simon.

    PS: Könnt ihr mir sagen, wo es eine Anleitung gibt wie ich den C-Debugger unter Eclipse zum Laufen bekomme? Ich erhalte immer nur folgende Meldung:
    http://www.abload.de/img/unbenanntxu2x.png



  • mikemodanoxxx schrieb:

    PS: Könnt ihr mir sagen, wo es eine Anleitung gibt wie ich den C-Debugger unter Eclipse zum Laufen bekomme? Ich erhalte immer nur folgende Meldung:
    http://www.abload.de/img/unbenanntxu2x.png

    nimm code:blocks http://www.codeblocks.org/
    eclipse ist als C-IDE ziemlich widerspenstig, hab ich mir sagen lassen (bzw. vor jahren selbst mal damit rumgefummelt, hat aber auch überall nur gehakelt).
    🙂



  • Könnt ihr mir sagen, wo es eine Anleitung gibt wie ich den C-Debugger unter Eclipse zum Laufen bekomme

    nimm easyeclipse http://www.easyeclipse.org/site/distributions/index.html und das flutscht 😉



  • ch habe allerdings festgestellt, dass Eclipse als erstes Argument automatisch den Pfad der Datei übergibt und ich somit die Argumente nur an Position 2 und 3 übergeben kann. Ist das immer so? Mit "blabla.exe string1 string2" übergibt er nämlich auch als erstes Argument den Dateinamen. In der Aufgabe wird nämlich eigentlich gefordert, dass exakt 2 Argumente erwartet werden.

    denke schon das das immer so ist, sonst könntest du ja keine software mit eclipse debuggen, sollte die da was verändern, das ist idr. immer so als würdest du es direct in der konsole machen, einzige ausnahme, die mir bisher aufgefallen ist, das sowas wie "ncurses" unter linux nicht geht, da er das terminal nicht richtig erkennt, aber wer braucht das heute noch 😉



  • noobLolo schrieb:

    Könnt ihr mir sagen, wo es eine Anleitung gibt wie ich den C-Debugger unter Eclipse zum Laufen bekomme

    nimm easyeclipse http://www.easyeclipse.org/site/distributions/index.html und das flutscht 😉

    Was brauche ich da noch? Ich habe es installiert und ein Projekt erstellt. Wenn ich es ausführen muss kommt da allerdings das Fenster mit den Run Configurations und ich weiß nicht, was ich dort einstellen muss?!



  • Ok hat sich erledigt, habe es mittlerweile hinbekommen.

    Jetzt habe ich aber noch ein Problem. Mit den Pointern komme ich noch nicht wirklich klar. Ich habe die Funktion runThreeArguments, die die Befehle mit 3 Argumenten ausführen soll. Dazu wird erst einmal parseArguments aufgerufen, die aus den Argumenten wie $v0, oder $t0 die Registerzahlen auslesen soll. Also wird beispielsweise aus $zero die 0, aus $t0 die 1 usw. Ich möchte also ein Array aus 3 Strings reinstecken und ein Array mit 3 Integertwerten rausbekommen. Leider habe ich keine Ahnung wie ich das machen soll. Habe mal ein wenig rumprobiert und den Code unten fabriziert. Was genau ist da falsch (habe zunächst gar nicht auf das Array zugegriffen sondern irgendwelche Werte zugeordnet um die Integerrückgabe zu testen)?

    void runThreeArguments(int line, char arg[3][80]) {
    	int* args = parseArguments(line, arg);
    	//printf("%i ", *args);
    }
    
    int* parseArguments(int line, char arg[3][80]) {
    	int* arguments[3];
    	*arguments[0] = 1;
    	*arguments[1] = 2;
    	*arguments[2] = 3;
    	return arguments;
    }
    


  • du kannst nicht ein statisches array in der function anlegen und es wieder raus geben, da jede locale variable bei verlassen der function gelöscht wird, du hast 2 möglichkeiten, per

    int *ret = malloc(sizeof(int)*3);
    

    speicher dynamisch erzeugen oder ein array als parameter übergeben

    void parseArgs(int *arr,char **data){
      arr[0] = 1;
      arr[1] = 2;
      arr[2] = 3;
    }
    

    damit setz dich doch erst mal auseinander bevor du anfängst dir eine stack maschine zu bauen, da kommst ja in teufels küche, wenn du das hast dann versuch doch mal nen string zu splitten die functionen die dir helfen heißen

    char *strtok(char *s1, const char *s2);
    und
    int strcmp(const char *s1, const char *s2);
    

    nwp2 hat mal folgenden link gepostet da sind einige beispiele
    http://www.cplusplus.com/reference/clibrary/cstring/
    und dann irgendwann kommt die stack maschiene 😉

    lg lolo



  • edit: erledigt


Anmelden zum Antworten