[C] Einlesen von Daten aus Textdokumenten

Danke für die Antwort.

Also ich glaub ich hab mich vorhin bisschen falsch ausgedrückt was ich machen möchte^^.
Also ich habe daten in einer txtdatei(quelle) stehen. diese sollen in ein puffer eingelesen werden und dann in eine andere txtdatei(ziel) eingefügt werden.
Jetzt kommt meine frage, ich will die daten die in der quelldatei stehen von unten anfangen einzulesen.
Ich hab mir das halt so vorgstellt das ich die daten nochmal einlese und diese jeweils eine nummer gebe. Und später dann mit der höchsten Zahl anfange die im array steht und diese dann in die zieldatei kopiert.
Ich poste einfach mal den code hier rein:
C:
int main(int argc, char* argv[])
{
	char srcname[256];			// Quelldateiname
	char destname[256];			// Zieldateiname
	unsigned int delay;			// Verzoegerungszeit in s
	FILE* srcfile, * destfile;	// Quell- bzw. Zieldatei
	int max_lines = 50;
	struct stat filestat;		// Dateiattributstruktur
	char sbuffer[max_lines][256];			// Zeilenpuffer fuer lesen
	int linesize;				// Zeilenpuffergroesse
	char* fbuffer;				// Dateipuffer fuer schreiben
	int i = 0;
	



	// lese Programmparameter ein
	if (argc != 4)
	{
		usage();
		return EXIT_FAILURE;
	}
	else
	{
		sscanf(argv[1], "%s", srcname);
		sscanf(argv[2], "%s", destname);
		sscanf(argv[3], "%u", &delay);
	}
	// oeffne Quelldatei
	srcfile = fopen(srcname, "rt");
	if (srcfile == NULL)
	{
		fprintf(stderr, "FEHLER: %s kann nicht geoeffnet werden.\n", srcname);
		return EXIT_FAILURE;
	}


	// Hauptschleife					
	while(i < max_lines && fgets(sbuffer[i], sizeof(sbuffer[i]), srcfile) != NULL)
	{	
		++i;
		
		
		// oeffne Zieldatei
		if ((destfile = fopen(destname, "rt")) == NULL)
		{
			fprintf(stderr, "FEHLER: %s kann nicht geoeffnet werden.\n", destname);
			return EXIT_FAILURE;
		}
		// lese Zieldatei in Puffer aus
		stat(destname, &filestat);									// status abfrage
		//	linesize = strlen(sbuffer);									// linesize ist stringlänge von sbuffer
		fbuffer =(char*) calloc(filestat.st_size + max_lines/*linesize*/, 1);	// dynamische speicherreservierung an fbuffer
		fread(fbuffer + max_lines/*linesize*/, filestat.st_size, 1, destfile);	// liest den speicherblock der destfile 
		fclose(destfile);											// schließe destfile		
		// schreibe Zeile in den Puffer
		memcpy(fbuffer,sbuffer,max_lines/*linesize*/);							// Speicher speicherblock, stringlänge von srcfile und stringlänge von sbuffer
		// schreibe Puffer in Zieldatei
		destfile = fopen(destname, "w+t");							// öffne destfile zum schreiben eines textes
		fwrite(fbuffer, strlen(fbuffer), 1, destfile);				// schreibe den speicherblock von fbuffer, die stinglänge von fbuffer in die destfile
		free(fbuffer);												// speicherbereich von fbuffer wird freigegeben
		fclose(destfile);											// schließe destfile
				
		// verzoegere Programmausfuehrung
		sleep(delay);
	    
	}


	fclose(srcfile);
	return EXIT_SUCCESS;
}
 
Also ich glaub ich hab mich vorhin bisschen falsch ausgedrückt was ich machen möchte^^.
Warum? Du möchtest die Zeilen einer Datei in den Speicher laden, was genau das ist was du gefragt hattest und weiterhin machen möchtest... :confused:
Also ich habe daten in einer txtdatei(quelle) stehen. diese sollen in ein puffer eingelesen werden und dann in eine andere txtdatei(ziel) eingefügt werden.
Jetzt kommt meine frage, ich will die daten die in der quelldatei stehen von unten anfangen einzulesen.
Ich hab mir das halt so vorgstellt das ich die daten nochmal einlese und diese jeweils eine nummer gebe. Und später dann mit der höchsten Zahl anfange die im array steht und diese dann in die zieldatei kopiert.
Und was ist jetzt deine Frage?

Gruß
 
Oh sry da war ich wohl heute morgen mit den gedanken wo anders.

Meine Frage ist, wie ich den Zeiger ans ende der txtdatei setze und dann von unten die daten einlese.
 
Oh sry da war ich wohl heute morgen mit den gedanken wo anders.

Meine Frage ist, wie ich den Zeiger ans ende der txtdatei setze und dann von unten die daten einlese.
Siehe fseek :suchen:

Man kann die Daten aber nur vorwärts lesen (alle read Funktionen lesen vorwärts und setzen den Lesezeiger nach vorn und nicht zürück). Warum willst du es denn nicht mit einem Puffer machen? Sind die Dateien zu groß?

Gruß
 
Hey danke für die Antwort.

ich hab mich schon mit fseek() beschäftigt und hab es soweit hinbekommen, das er ans EOF springt und an den datei anfang, da ich ja eine konstante stringlänge hab.
Ich war auch am überlegen ob es auch mit einem Puffer geht, meine Datei wird immer größer da ich in die Textdatei immer neue (konstante stringlängen) Daten eintrage. Momentan hab ich eine größe von 4kB. Wenn ich das also alles in einem Puffer mache, wie würde es dann aussehen?!
 
Ich war auch am überlegen ob es auch mit einem Puffer geht, meine Datei wird immer größer da ich in die Textdatei immer neue (konstante stringlängen) Daten eintrage. Momentan hab ich eine größe von 4kB. Wenn ich das also alles in einem Puffer mache, wie würde es dann aussehen?!
1. Dateigröße bestimmen (z.B. mit ftell)
2. Puffer der benötigten Größe mit malloc erzeugen
3. Daten mit fread einlesen

Gruß
 
So ich hab es jetzt soweit gemacht wie du es mir vorgeschlagen hast.
Das ist jetzt erst ein Testprogramm, das die zeilen und die stringlänge zählt.
Und meine Frage ist, wie mach ich das mit 2D-arrays, das im ersten index die zeile steht und im zweitem index der inhalt der zeile?!
Hab noch nie mit 2d-arrays gearbeitet und die 1D-arrays fallen mir auch schwer bin da noch nicht fit!



C:
int main(void)
{
	FILE *srcfile;
	char ZeBuf[500];
	int iCount = 0;
	int i = 0;
	long sizeFile= 0;
	char *sizeBuf;
	

	srcfile = fopen("quelle.csv","r");
	
	//Zähle Zeilen und stringlänge
	while(fgets(ZeBuf,500,srcfile) != NULL)
	{
		iCount++;
		i = strlen(ZeBuf)+1;
		printf(" \"%d\" Zeile und eine Stringlaenge von \"%i\"\n",iCount,i);
	}
	sizeFile = ftell(srcfile);		//Dateigröße bestimmen
	sizeBuf = (char*) malloc(sizeFile);		//zwischenspeichergröße ermitteln
	fread(sizeBuf, i, 1, srcfile);			// Daten einlesen


	printf("\n");
	printf("Es sind insgesamt \"%d\" Zeilen in der Datei\nftell groesse = \"%d\"\n\n",iCount,sizeFile);

	
	printf("\n\n");
	fclose(srcfile);
	free(sizeBuf);


	return EXIT_SUCCESS;

}
 
Hi.

Also erstmal solltest du immer prüfen ob überhaupt etwas eingelesen wurde. Wenn der Dateizeiger sich am Dateiende befindet und du fread aufrufst, wird mit Sicherheits nichts eingelesen...

Außerdem meintest du wohl sizeFile statt i beim fread Aufruf.
C:
fileSize = ftell(srcfile);
    fseek(srcfile, 0, SEEK_SET);
    fileBuf = malloc(fileSize);
    if (sizeBuf == NULL) {
       // ups, Datei zu groß...
       exit(1);
    }
    if (fread(fileBuf, fileSize, 1, srcfile) == 1) {
       // ...
    }
Wenn du die Daten im Puffer hast, könntest du den Puffer rückwärts nach Zeilenendemarkierungen durchsuchen:
C:
char* ptr = fileBuf + fileSize;
char* end = ptr;

while (ptr > fileBuf) {
  --ptr;

  if (*ptr == '\n' || *ptr == '\r') {
    // Zeile ausgeben [ptr - end]
    ...
    end = ptr;
  }
}

Für ein 2D Array müßtest du erstmal ein Array von "char*" anlegen und dieses Array dann füllen indem du für jede Zeile genug Speicher reservierst und die Daten dann in das 2D Array kopierst. Aber wozu willst du das so kompiliziert machen? Wenn du nur die Zeilen rückwärts ausgeben willst, mußt du ja nicht unbedingt auf die Zeilen wahlfreien Zugriff haben...

Gruß
 
Programm läuft soweit gut, hat nur kleine Ausgabefehler aber die sind schnell zu lösen.

Danke für deine Hilfe:)
 
Zurück