Listenelemente in eine txt-Datei auslesen (fputs)

Davicito

Erfahrenes Mitglied
Hallo,

ich hab nun meine Liste fertig und will die zum Einen auf meiner Konsolle ausgeben (das funktioniert) und zum Anderen in einer Textdatei festhalten

hier der Auszug aus meinem Code:
Java:
void print_all(node* list, void* (*get)(void*))
{
	node* kopf      = list;
	node* aktl_Elem = list;
	FILE *file2;
	char* string = NULL;
	int zahl = 0;

	if(kopf == NULL && kopf -> content == NULL)
	{
		return;
	}	
	else
	{		
		while(kopf != (aktl_Elem = aktl_Elem -> left)) // durchläuft die liste ienmal
		{
			printf(" %i. ", aktl_Elem -> nodeCounter); // gibt den Listenindex aus
			string = (char*) get(aktl_Elem -> content); // gibt den Listeninhal auf der konsole aus und liest diesen dan iknstring ein
			zahl = aktl_Elem -> lineCounter; // liest die Zeilennummer der eingelesenen Wörter ein
			printf(" %i", zahl);
							
			printf("\n");
			strcat(string, " "); // hängt an jedes Wort ein blank
			strcat(string, (char*) zahl ); // Zeilennummer ist vom type int in meinem Struct und wird gecastet um an string angehängt zu werden 
			printf(" String: %s", string);  // zur Prüfung soll mir das ausgegeben werden
			fputs(string, file2); // Nun soll der komplette String in die Ausgabedatei gespeichert werden 
			
		}
	}		
}
...
//Auszug aus der Main-Funkion
...
// Überprüfung, ob eine Textdatei übergeben wurde.
	if(argc > 1 && (file1 = fopen(argv[2], "r")) != NULL && (file2 = fopen(argv[1], "w")) != NULL)
	{
		// Gesamten Textinhalt auslesen, bis zum Textendezeichen.
		while(fgets(buffer, SIZE, file1) != NULL)
		{					
			counter1++;  // Zählt die Zeilen
			int wortLineCounter = 0;
			int schalter = 0;  // Nicht wichtig... ist nur für Bubblesort-Algorithmus
	
			// Wörter einlesen	    		
			wort = strtok(buffer, splitt);
			
			// Wörter solange einlesen, wie Wörter über Buffer übergeben 	werden.			
			while(wort != NULL)
			{							    	
				anhaengen(aktl_Elem, wort, copyString, counter1);
					
				wort = strtok(NULL, splitt);
		    		wortLineCounter++;
				schalter = 1;			
			}
			if(schalter == 1)
			{
				sort(aktl_Elem, wortLineCounter, schranke);
				schranke += wortLineCounter; 
			}						    		
		}
		
		// Gibt alle Listenelemente aus			
		print_all(aktl_Elem, printString); //Aufruf zur Ausgabe auf der Konsole und zum Speichern in einer txt-Datei. 
		fclose(file2);
		fclose(file1);
	}

Mein Problem jetzt ist, das ich die Listenausgabe nicht in meine Textdatei bekomme.
das hängt auch mit dem cast in Zeile 24 zusammen. ab da an giebt es Probleme. Beim Kopellieren ist allles ok aber in Zeile 25 wird die Zahl nicht an meinen string gehangen. Wenn ich Zeile 24-26 auskommentiere, Zeigt er mir alle wieder auf meiner Konsole an. mit den Beiden Zeilen wier weder etwas auf der Konsole angezeigt, noch in eine Datei geschrieben.

definition aus meinem struct
Java:
typedef struct node
{
	struct node* right; // Zeiger auf das Nachfolgerelement
	struct node* left;  // Zeiger auf das Vorgängerelement
	void* content;      // Für den Dateninhalt
	int lineCounter;
	int nodeCounter;	
} node;

node* init_Liste();
node* anhaengen(node* list, void* neuer_String, void* (*set)(void*), int counter);
void sort(node* list, int wortLineCounter, int schranke);
void print_all(node* list, void* (*get)(void*));

node* delete_Node(node* list);
node* delete_Liste(node* list);

Kann mir da jemand weiter helfen?

Liebe Grüße.
 
Zuletzt bearbeitet:
Hi.

Was macht die get Funktion?

Insbesondere, wird denn überhaupt genügend Speicher für strlen(string) + strlen(" ") + x alloziert? Erstellst du überhaupt eine Kopie der Daten in der get Funktion?

Warum verwendest du nicht einfach fprintf?

Zu Zeile 24: Ein int kann nicht in einen String gecastet werden. Du müßtest sprintf verwenden.

Gruß
 
Ok.. offensichtlich macht fputs das nicht mit zahlen!! Auch dann nicht, wenn mann den int-type castet auf char*

ich musste nur fputs durch fprintf ersetzten. Damit lassen sich mehrere Datentypen in eine Datei schreiben

siehe code:
Java:
void print_all(node* list, void* (*get)(void*), FILE* file2)
{
	node* kopf      = list;
	node* aktl_Elem = list;	
	char* string = NULL;		

	if(kopf == NULL && kopf -> content == NULL)
	{
		return;
	}	
	else
	{		
		while(kopf != (aktl_Elem = aktl_Elem -> left))
		{			
			//Formatierte Ausgabe auf der Konsole			
			printf(" %i. ", aktl_Elem -> nodeCounter);
			string = (char*) get(aktl_Elem -> content);			
			printf(" %i", aktl_Elem -> lineCounter);					
			printf("\n");
			
			//In einer Textdatei einlesen			
			fprintf(file2,"%s %i\n", string, aktl_Elem -> lineCounter);			
		}
	}        	
}

Liebe Grüße.
 
Hi deepthroat,

die get funktion liefert nur einen string zurück und printet selber alle Elemente meiner liste auf der Konsole aus.. einfach ignorieren******

Aber ich habe jetzt mal eine andere Frage zu fprintf.
wieso mag er meine if-Verzweigungen nicht**** -> siehe abgeänderten code von oben!

Java:
void print_all(node* list, void* (*get)(void*), FILE* file2)
{
	node* kopf      = list;
	node* aktl_Elem = list;	
	char* string = NULL;	
	char* string1 = NULL;
	char* string2 = NULL;

	if(kopf == NULL && kopf -> content == NULL)
	{
		return;
	}	
	else
	{		
		while(kopf != (aktl_Elem = aktl_Elem -> left))
		{
			string1 = (char*) aktl_Elem -> content;		//Wort des aktuellen Elements
			string2 = (char*) aktl_Elem -> left -> content; //Wort des lenken Elements
			//Formatierte Ausgabe auf der Konsole
			if(strcmp(string1, string2) < 0)
			{
				printf(" %i. ", aktl_Elem -> nodeCounter);
				string = (char*) get(string1);			
				printf(" %i", aktl_Elem -> lineCounter);					
				printf("\n");				
			}
			else if(strcmp(string1, string2) == 0)
			{
				printf(" %i", aktl_Elem -> lineCounter);
				string = (char*) get(string1);						
				printf("\n");				
			}
             /*
			printf(" %i. ", aktl_Elem -> nodeCounter);
			string = (char*) get(aktl_Elem -> content);			
			printf(" %i", aktl_Elem -> lineCounter);					
			printf("\n");
			*/

			//In einer Textdatei einlesen			
			fprintf(file2,"%s %i\n", string, aktl_Elem -> lineCounter);			
		}
	}        	
}

Wenn ich diese If's reinmache, spät mir fprintf die Ausgabe auf der Konsole und schreibt nichts in die datei.

Woran kann das liegen?
 
Zuletzt bearbeitet:
Ok.. offensichtlich macht fputs das nicht mit zahlen!! Auch dann nicht, wenn mann den int-type castet auf char*

Solche Sachen findest du immer in der Referenz beschrieben. Zum Parameter str von fputs findest du folgende Erklärung:
An array containing the null-terminated sequence of characters to be written.

Ein int ist weder ein Array noch eine Sequenz von 0-terminierten Charakteren ;)

/Edit:
C:
if(kopf == NULL && kopf -> content == NULL)
    {
        return;
    }

Diese Abfrage führt zwigend zu einer Zugriffsverletzung, wenn kopf NULL ist. Denn dann wird der erste Ausdruck zu true ausgewertet und um den ganzen Ausdruck auswerten zu können muss noch der zweite Teil geprüft werden, da ja && true von beiden Seiten erwartet. Also wird kopf->content ausgewertet, was aber nicht geht, da ja kopf NULL ist.

Du meinst wohl eher eine ODER-Verknüpfung und nicht eine UND-Verknüpfung.

Gruss
Muepe

PS:
Für C-Code kannst du die Tags [c][/c] verwenden an Stelle der [code=java][/code]
 
Zuletzt bearbeitet:
Das mit der Zugriffsverletzung habe ich nicht verstanden... das fprintf funktioniert ja in dem else-Zweig.. das hat ja nichts mit dem if dafor zu tun******

es get nur darum das wenn ich innerhalb meiner While-Schleife eine 2. If-Abfrage vor meinem fprintf() setzte, dass dann meine fprintf nicht mehr will.
Wenn ich die If-Abfrage aus meiner Schleife nehme, funktioniert ja alles wieder.

Nur warum?
Gruß
 
Hi.

Zu dem Problem welches muepe32 angesprochen hat, bekommst du auch eine Zugriffsverleztung weil du auf string zugreifst:
C:
char* string = NULL;

while () {
  ..
  if («false») {
  } else if («false») {
  }
  fprintf(f, "...", string, ...); // <<< string == NULL
}
Das kommt daher weil du einen Fall unterschlagen hast und string in der Schleife nicht in jedem Fall auf einen gültigen Wert setzt.

Gruß
 
Ah verstehe... also einfach nur den String abfangen, wenn string NULL ist.
Das probiere ich gleich mal aus.

Gruß
 
hmm also darann hat das auch nicht gelegen!!

C:
while(kopf != (aktl_Elem = aktl_Elem -> left))
		{
			string1 = (char*) aktl_Elem -> content;		//Wort des aktuellen Elements
			string2 = (char*) aktl_Elem -> left -> content; //Wort des lenken Elements
			//Formatierte Ausgabe auf der Konsole
			if(strcmp(string1, string2) != 0)
			{
				printf(" %i. ", aktl_Elem -> nodeCounter);
				string = (char*) get(string1);			
				printf(" %i", aktl_Elem -> lineCounter);					
				printf("\n");
			
				//In einer Textdatei einlesen			
				//fprintf(file2,"%s %i\n", string, aktl_Elem -> lineCounter);	
			}
			else if(strcmp(string1, string2) == 0)
			{
				printf(" %i", aktl_Elem -> lineCounter);
				string = (char*) get(string1);						
				printf("\n");
				//fprintf(file2,"%s %i\n", string, aktl_Elem -> lineCounter);	
				
			}
			
			//In einer Textdatei einlesen
			if(string != NULL )
			{			
				fprintf(file2,"%s \n", string);//, aktl_Elem -> lineCounter);
			}			
		}
 
hmm also darann hat das auch nicht gelegen!!
Ich habe mich geirrt bzw. nicht richtig gelesen. Du schreibst zuviel unnötigen Code, das bin ich nicht gewohnt. :-(
Ich hab ja doch richtig geschaut, du hast jetzt die Bedingung geändert, so dass das Problem nicht mehr auftreten kann.
C:
if(strcmp(string1, string2) != 0) // entweder != 0
{
  ...
} else { // oder == 0
  ...
}
Wie hast du denn die Datei geöffnet? fopen Aufruf?

Was gibt fprintf zurück?

Verwende einen Debugger.

Übrigens liest fprintf bzw. fputs nichts ein, sondern gibt etwas aus.

Gruß
 
Zuletzt bearbeitet:
Zurück