Anzeige

Datei auslesen und weiterverarbeiten


#1
Hallo zusammen,

ich bin gerade dabei ein Programm zu schreiben, welches zeilenweise aus einer Datei einen Wert (in der Form w=0.000) mithilfe einer Funktion einliest, diesen einspeichert und in anderen Funktionen weiterverarbeitet. Danach soll in der nächsten Zeile der Datei ein neuer Wert eingelesen werden, und wieder verarbeitet werden usw. An sich alles kein Problem, nur an der Schleife des Einlesens scheitert es. Kann mir jemand einen Tipp geben?o_O
 
#3
C:
typedef struct{
 float iRadius;
 float iFlaeche;
 float iUmfang;
 } Kreis;
//
float DatenLesen(char *pFile);
void DatenVerarbeiten(Kreis*pKreise, int number );
int DateiSchreiben(char *pFile, Kreis*pKreise,int number);
//
int main(int argc, char *argv[]){
 FILE *pInput;
 int iNum=0, iCheck=0;
 char sInput[200], sOutput[200];

//Datei öffnen
 pInput = fopen ("resources/input.txt","r");
 if( pInput == NULL){
            printf("Error\n");
      return -1;}
 else printf("File opened!\n");
//Speicher reservieren
 Kreis *pKreise = (Kreis*)malloc(iNum*sizeof(Kreis));
 fgets(sInput, 5, pInput);
 pKreise-> iRadius = DatenLesen(sInput);
//Rechnung und Datei schließen
 DatenVerarbeiten(pKreise, iNum);
 sprintf(sOutput,"r=%f A=%f S=%f",pKreise->iRadius,pKreise->iFlaeche,pKreise->iUmfang);
 fclose (pInput);
//Daten in Datei schreiben
 iCheck=DateiSchreiben(sOutput, pKreise, iNum);
 return iCheck;
 }

float DatenLesen(char *pFile){
 float iRadius2=0;
// sscanf(pFile, "r=%f\n", &iRadius2);
 iRadius2=(float)*pFile;
 return iRadius2;
}
void DatenVerarbeiten(Kreis *pKreise, int number){
   pKreise -> iFlaeche = pi*pow(pKreise ->iRadius,2);
  pKreise -> iUmfang = 2*pi*pKreise-> iRadius;

}
int DateiSchreiben(char *pFile, Kreis *pKreise,int number){
 FILE *pOutput;
 pOutput= fopen ("resources/outputFunction.txt","a");
  if( pOutput == NULL){
              printf("Error\n");
        return -1;}
  else{fprintf(pOutput, "%s\n\r", pFile);
  printf("Done!\n");
   return 0;
  }
}
Die Funktionen waren vorgegeben (abgesehen vom Rückgabewert) und sind erstmal nur blind kopiert. Erste Zeile einlesen klappt auch wunderbar, fehlen halt nur die folgenden.
 

cwriter

Erfahrenes Mitglied
#4
Die Funktionen waren vorgegeben (abgesehen vom Rückgabewert) und sind erstmal nur blind kopiert.
Äh - sicher? "char*" deutet auf einen String hin, aber "pFile" auf einen File-Pointer. Die Basis ist nicht optimal.

Erste Zeile einlesen klappt auch wunderbar, fehlen halt nur die folgenden.
Ok, du hast ein fgets(), das die erste Zeile einliest. Dann kommt DatenLesen() und holt die Information aus dem String. Hinweis: fscanf() macht dasselbe in einem Schritt.
Also musst du um diese beiden Zeilen eine Schleife bauen:
C:
int i = 0;
while(fgets(sInput, 5, pInput) != NULL)
{
 pKreise[i++].iRadius = DatenLesen(sInput);
}
fgets() gibt NULL zurück, wenn es nichts mehr zu lesen gibt. Wenn es etwas zu lesen gibt, dann lesen wir die Daten in den pKreise-Array (i < iNum muss immer erfüllt sein).
Danach kannst du wieder über den Array iterieren, um Umfang und Fläche zu berechnen, und dann nochmals, um alles zurückzuschreiben. Alternativ kannst du auch einlesen, verarbeiten und ausgeben pro Eintrag. Dann brauchst du aber keinen Array, sondern nur einen Kreis als temporäre Variable.

Gruss
cwriter
 
#5
Okay, das habe ich gemacht, allerdings bekomme ich nun diese Fehlermeldung:
*** Error in `./output': double free or corruption (out): 0x08f38580 ***
Werde aus den Beschreibungen im Internet nicht so richtig schlau, was ist der Fehler?
 

cwriter

Erfahrenes Mitglied
#6
Werde aus den Beschreibungen im Internet nicht so richtig schlau, was ist der Fehler?
Ohne Code ist das immer schwer.

Im Allgemeinen heisst der Fehler, dass etwas mit dem Heap-Speicher falsch lief - Enweder hast du free() mehrmals auf denselben Speicherbereich ausgeführt, ein free() auf einen nicht von malloc() zurückgegebenen pointer ausgeführt, oder mehr in einen Speicherbereich geschrieben, als du reserviert hast.

Gruss
cwriter
 
Anzeige
Anzeige