www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem beim Einlesen von Daten


Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe, wie man der Topic entnehmen kann, ein kleines Problem beim 
Einlesen von Daten.
In meinem Programverzeichnis liegen zwei .txt Datein (real.txt und 
imag.txt), welche ich gerne in die beiden Arrays re[laenge] und 
imag[laenge] einlesen würde. Nachfolgend mein kleiner Programmcode:

#include <stdio.h>
#define laenge 4096

void main()
{

 FILE *preal;
 FILE *pimag;

 char buf1[laenge];
 char buf2[laenge];

 float re[laenge];
 float im[laenge];



   preal = fopen("real.txt","r");
         fgets(buf1,laenge,preal);
   fscanf(preal,"%f",&re[laenge]);
   fclose(preal);



   pimag = fopen("imag.txt","r");
   fgets(buf2,laenge,pimag);
   fscanf(pimag,"%f",&im[laenge]);
   fclose(pimag);
}


Ich hoffe ihr habt eine Idee wo der Fehler sein könnte. Vermutlich habe 
ich da was bei den Funktionen durcheinander geworfen, die ich aus der 
Hilfe vom Complier genommen habe. Aber leider komme ich nicht drauf!


Gruß Michael

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael wrote:

>    preal = fopen("real.txt","r");
>          fgets(buf1,laenge,preal);

Das liest nur die erste Zeile ein. Das ist dir hoffentlich bewusst.

>    fscanf(preal,"%f",&re[laenge]);

Ein Array der Länge 4, hat als gültige Indizes 0 bis 3

  0, 1, 2, 3

zähl nach, das sind 4 Stück. Ein ArrayElement mit dem Index 4
existiert schlicht und ergreifend nicht.
Aber warum liest du in den letzten deiner 4096 float Variablen
ein? Warum nicht in den ersten?

    fscanf(preal,"%f",&re[0]);

>
>    pimag = fopen("imag.txt","r");
>    fgets(buf2,laenge,pimag);
>    fscanf(pimag,"%f",&im[laenge]);

Hier noch mal

>    fclose(pimag);
> }
>
>
> Ich hoffe ihr habt eine Idee wo der Fehler sein könnte.

Welcher Fehler?
Bisher hast du nur Code gezeigt und kein Wort darüber verloren
was denn so passiert.

In deinem Code gibt es noch einen anderen Stolperstein.
Was passiert eigentlich, wenn die Datei nicht geöffnet werden konnte?
Merke: Den Returnwert von fopen immer auf Gültigkeit prüfen!
#include <stdio.h>

#define BUF_LEN 4096

int main()
{
  FILE *preal;
  FILE *pimag;

  char buf1[BUF_LEN];
  char buf2[BUF_LEN];

  float re
  float im

  preal = fopen("real.txt","r");
  if( preal == NULL ) {
    printf( "Konnte Datei 'real.txt' nicht öffnen!\n" );
    return 1;
  }
  fgets(buf1,laenge,preal);
  fscanf(preal,"%f",&re);
  fclose(preal);

  pimag = fopen("imag.txt","r");
  if( pimag == NULL ) {
    printf( "Konnte Datei 'imag.txt' nicht öffnen!\n" );
    return 1;
  }
  fgets(buf2,laenge,pimag);
  fscanf(pimag,"%f",&im);
  fclose(pimag);

  return 0;
}

PS: Du willst nicht wirklich den Datentyp 'float' benutzen.
float macht nur in ganz bestimmten Situationen Sinn. Auf einem
PC benutzt man heutzutage praktisch immer double (es sei denn
du brauchst tatsächlich mehrere Milliarden davon). Alles andere
ist Masochismus.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Karl Heinz ich werde Deine Tipps in meinen Code einbauen, aber ich 
muss gestehen, dass mir noch gewaltig der Durchblickt fehlt.
Theoretisch ist es mir vollkommen klar was ich machen muss, nur macht 
mir die Umsetzung in C-Code Probleme. "Softwareentwicklung" ist nicht 
wirklich mein Ding, um es mal diplomatisch auszudrücken.

Was später im Programm passieren soll?!

Nun ja zu allererst sollen Daten aus einer Textdatei eingelesen und in 
einem Array gespeichert werden. Anschliessend wird dieses Array dann mit 
einem anderen Array multipliziert. Das Produkt wird dann entsprechend 
weiter verarbeitet.


Gruß Michael

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael wrote:
> Danke Karl Heinz ich werde Deine Tipps in meinen Code einbauen, aber ich
> muss gestehen, dass mir noch gewaltig der Durchblickt fehlt.
> Theoretisch ist es mir vollkommen klar was ich machen muss, nur macht
> mir die Umsetzung in C-Code Probleme. "Softwareentwicklung" ist nicht
> wirklich mein Ding, um es mal diplomatisch auszudrücken.
>
> Was später im Programm passieren soll?!
>
> Nun ja zu allererst sollen Daten aus einer Textdatei eingelesen und in
> einem Array gespeichert werden. Anschliessend wird dieses Array dann mit
> einem anderen Array multipliziert. Das Produkt wird dann entsprechend
> weiter verarbeitet.

Du solltest eventuell mal mit einfacheren Dingen ein paar Vorübungen
machen. Beim File-Handling kann schon so einiges schief gehen.
Besorg dir einen Kernighan&Ritchie und arbeite darin die ersten
paar Kapitel durch. Solange du mit Arrays auf Kriegsfuss stehst,
hat es keinen Sinn sich um File Handling Gedanken zu machen.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da gebe ich Dir voll und ganz recht, werde morgen mal mein C-Buch 
konsultieren, welches ich leider nicht zur hand hatte und mich etwas 
einlesen.
Hatte vorhin einfach nur versucht die Funktionen, welche ja in der Hilfe 
beschrieben sind, auf meine Variablen/Gegebenheiten anzupassen. Wenn das 
auf Anhieb gepasst hatte, wäre das auch zu schön gewesen ... ;)

Vielen Dank nochmal für die Ratschläge, ich denke man schreibt sich 
morgen nochmal ;)


Gruß Michael

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.