Mehrere Dateien nacheinander in einer Schleife öffnen?
-
Hallo Profis,
eine Frage, ich würde gerne Dateien, deren Dateiname in einem String Array datenfile[i] stehen, nacheinander aufrufen und die erste Zeile auslesen. Bei der ersten Datei funktioniert das noch ganz gut. Bei der zweiten Datei stützt das Programm ab. Kann es sein, dass ich den File* Zeiger erstmal wieder freigeben muss oder sowas?
Die Dateinamen sind richtig in dem Array abgelegt. Das habe ich schon überprüft.Vielen Dank für Eure Hilfe.
Manuel
for (i=0; i <=(anzahl-2); i++) { printf("%s\n",datenfile[i]); printf("%i\n",i); FILE* data = fopen(datenfile[i], "r"); //FILE immer alles gross if (data == NULL) { printf("Abbruch: Lesefehler Datenfile %s.\n\n", datenfile[i]); system("PAUSE"); return 0; } fgets(buffer,20,data); printf("%s ",buffer); fclose(data);
-
Hast du mal im Debugger verfolgt, wo genau dein Programm abstürzt? Und hast du in deinem Puffer genug Platz für die Eingaben (andernfalls besteht die Gefahr, daß du dir beim fgets()-Aufruf den Speicher kaputtmachst).
PS: eigentlich reicht der fclose()-Aufruf, um den Zeiger wieder freizugeben.
-
Vielen Dank schon mal für den Debugger - Tip.
Ich benutze die IDE von DEC C++ und habe auch mit dem Debugger probiert. Wenn ich die Datei komplett ausführe, bleibt das Programm hängen. Wenn ich es im Debugger Schritt für Schritt ausführe, läuft die gewünschte Funktionalität ab. Könnte es daran liegen, wie schnell das Prog abläuft?
Für Ideen wäre ich sehr dankbar.Manuel
#include <stdio.h> #include <stdlib.h> #include <time.h> /* Name: Datensammler 0.1 Copyright: open source Author: Manuel Behrens Date: 28.05.11 20:20 Description: Dieses Programm soll Daten aus vorher festgelegten Dateien sammeln und als .CSV Datei ablegen. Es wird nur die erste Zeile in jeder Datei berücksichtigt. Language: Deutch */ void chomp(char *str) { size_t p=strlen(str); /* '\n' mit '\0' überschreiben */ str[p-1]='\0';} int main(int argc, char *argv[]) { // Deklaration // Konstanten const char ininame[] = {"sammler.ini"}; const char csvname[] = {"sammler.csv"}; const int laenge = 256; //Variable int anzahl, status, i; char datenfile[100][laenge]; char buffer[20]; char kopfzeile[256]; char datenzeile[1000] = {""}; //Aktuelle Zeit wird fürs Logfile ermittelt! // Initialisierung // Es werden die Dateinamen aus dem Inifile gelesen. FILE* ini = fopen(ininame, "r"); //FILE immer alles gross if (ini == NULL) { printf("Abbruch: Lesefehler Konfigurationsdatei %s.\n\n", ininame); system("PAUSE"); return 0; } anzahl = 0; do{ status = fgets(datenfile[anzahl],laenge,ini); anzahl++; } while (status != NULL); fclose(ini); printf("%i\n", anzahl); for (i=0; i <=(anzahl-1); i++) { chomp(datenfile[i]); printf ("%s \n", datenfile[i]); } // Die Kopfzeile der Datensammler CSV wird geschrieben. FILE* csvk = fopen(csvname, "w+"); //FILE immer alles gross if (csvk == NULL) { printf("Abbruch: Schreibfehler %s.\n\n", csvname); system("PAUSE"); return 0; } strcat(kopfzeile,"Datum/Uhrzeit;"); for (i=0; i<=(100);i++) { strcat(kopfzeile,datenfile[i]); strcat(kopfzeile,";");} fputs(kopfzeile,csvk); fclose(csvk); // Hauptprogramm //Datum wird in die Datenzeile geschrieben. //strcat(datenzeile,ctime(&now); strcat(datenzeile,";"); // Daten aus den Dateien auslesen. for (i=0; i <=(anzahl-2); i++) { printf("%s\n",datenfile[i]); printf("%i\n",i); printf("wurst2"); FILE* data = fopen(datenfile[i], "r"); //FILE immer alles gross if (data == NULL) { printf("Abbruch: Lesefehler Datenfile %s.\n\n", datenfile[i]); system("PAUSE"); return 0; } fgets(buffer,20,data); printf("\n%s ",buffer); fclose(data); strcat(datenzeile,buffer); strcat(datenzeile,";"); printf("%s ",datenzeile); printf("wurst1"); } //Zeile zusammensetzen! printf("wurst"); //Dateinzeile wird in die CSV kopiert. FILE* csv = fopen(csvname, "w"); //FILE immer alles gross if (csv == NULL) { printf("Abbruch: Schreibfehler %s.\n\n", csvname); system("PAUSE"); return 0; } fputs(datenzeile,csv); fclose(csv); system("PAUSE"); return 0; }
-
Du hast vergessen, den Inhalt von
kopfzeile
zu initialisieren. Das kann im Debugger gut gehen, weil der alle neuen Variablen ausnullt, fliegt dir aber im produktiven Einsatz um die Ohren, wenn dort irgendwelche Mülldaten herumliegen (indbesondere wenn die nicht nullterminiert sind).
Außerdem könnte es passieren, daß Kopfzeile zu klein wird für alle Dateinamen (in 256 Zeichen hast du Platz für für ca. 20 Dateien).
-
In Zeile 57 und 59 gibt der gcc Warnungen und der DMC Fehler
Der gcc gibt noch weitere Warnungen.
Kannst du das ein wenig übersichtlicher formatieren?
Language: deutsch, german, allemand, tadesco
MfG f.-th.
-
void erstezeilemehrererdateienineineandereschreiben(char **dateien,char *d) { FILE *x,*f=fopen(d,"a"); if( !f ) return; while( *dateien ) { if( x=fopen(*dateien++,"r") ) { char z[100]; if( fgets(z,100,x) ) fprintf(f,"%s\n",((strchr(z,'\n')?*strchr(z,'\n')=0:0),z)); fclose(x); } } fclose(f); } int main() { char *dateien[3]={"bla1.txt","bla2.txt"}; erstezeilemehrererdateienineineandereschreiben(dateien,"bla3.txt"); return 0; }