Forum: PC-Programmierung C Probleme beim öffnen einer *.txt Datei.


von Marcel S. (marcel_s)


Angehängte Dateien:

Lesenswert?

Hallo

ich hoffe die C-Speziallisten können mir bei folgendem
Probleme helfen.

Ich möchte double Zahlen aus der Textdatei m.txt auslesen. Die Datei
möchte ich mit der Funktion MessdatenLesen(datei, messwA); öffnen.


Wenn ich das versuche kommt diese Fehlermeldung:

Unbehandelte Ausnahme bei 0x6ca060a6 in messdaten.exe: 0xC0000005:
Zugriffsverletzung beim Schreiben an Position 0x00000000.

Ich vermute einen Zeigerfehler hab aber schon in einigen Büchern die
Kapitel über Zeiger und Arrays gelesen und nichts gefunden was mir
hilft.

Dateien sind hochgeladen



Vielen Dank



Marcel

von Peter II (Gast)


Lesenswert?

while(fscanf_s(mDatei,"%f",mW)!=EOF)

mW muss als Adresse übergeben werden  -> @mW

von Peter II (Gast)


Lesenswert?

so weiter:

du speicherst deine Daten überhaupt nicht im Array.

> if((messwA[ret]<=OBEN) && (messwA[ret]>=UNTEN))
ret ist hier die falsche variabel, müsste i sein.

1
 for(i=0; i<ret; ++i)
2
  {
3
    if((messwA[ret]<=OBEN) && (messwA[ret]>=UNTEN))
4
    {
5
      ++n;
6
    }
7
  }
8
  retA=i/(ret/100);
9
  return retA;
wozu die schleife wenn du n überhaupt nicht verwendest?

von Um Gottes Willen (Gast)


Lesenswert?

Heiliger Strohsack....

von Marcel S. (marcel_s)


Lesenswert?

So soll die Schleife aussehen.
1
double Auswertung(double messwA[], int ret)
2
{
3
  double retA;
4
5
  int i, n=0;
6
  for(i=0; i<ret; ++i)
7
  {
8
    if((messwA[ret]<=OBEN) && (messwA[ret]>=UNTEN))
9
    {
10
      ++n;
11
    }
12
  }
13
  retA=(n/ret)*100;
14
  return retA;
15
}

danke für den Hinweis. Leider sind meine Programmierfähigkeiten noch 
sehr schlecht ich setze alles dran dazu zulernen.

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Um Gottes Willen schrieb:
> Heiliger Strohsack....

Ja.

von Peter II (Gast)


Lesenswert?

Marcel S. schrieb:
> So soll die Schleife aussehen.

dann ist sie aber immer noch falsch, lies mir mein Hinweis noch mal 
durch.

von Marcel S. (marcel_s)


Angehängte Dateien:

Lesenswert?

Hallo Peter,

vielen Dank für die hilfreichen Tipps.

Das Programm funktioniert jetzt. Ich würde mich sehr freuen wenn ihr mir 
sagt was ich noch verbessern kann. Ich möchte durch eure Kritik 
dazulernen.

Gruß

Marcel

von Uhu U. (uhu)


Lesenswert?

Ich würde eine Kommandozeilen-Applikation draus machen, die den 
Dateinamen über die Kommandozeile erhält.

Wozu ist as system("PAUSE") am Ende gut?

von Marcel S. (marcel_s)


Lesenswert?

Uhu Uhuhu schrieb:

> Wozu ist as system("PAUSE") am Ende gut?

Ohne wird das DOS Fenster in Windows immer geschlossen, bevor ich die 
Ausgabe erkennen kann. Gibt es da eine elegantere Lösung?

von Uhu U. (uhu)


Lesenswert?

Marcel S. schrieb:
> Gibt es da eine elegantere Lösung?

Wenn du das Kommandozeilenfenster zuerst öffnest und dort den Aufruf 
reinschreibst, bleibt es offen.

Dein Programm, so wie es jetzt ist, ist ein GUI-Programm ohne GUI.

von Karl H. (kbuchegg)


Lesenswert?

Marcel S. schrieb:
> Hallo Peter,
>
> vielen Dank für die hilfreichen Tipps.
>
> Das Programm funktioniert jetzt. Ich würde mich sehr freuen wenn ihr mir
> sagt was ich noch verbessern kann. Ich möchte durch eure Kritik
> dazulernen.

ABgesehen von der GUI Diskussion:

gets ist eine "Funktion non grata". Also eine Funktion die du NIEMALS 
benutzen solltest. Immer fgets benutzen!

Du hast keine Kontrolle darüber, was dein Benutzer an der Tastatur alles 
aufführt. Der kann dir da eine Eingabe von
1
kkkkkkkkkkkkkkkkkkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaallllllllllllllllllllllddddddddddddddddddddd

reinpfriemeln, welche gets versucht in dein Array zu stopfen. Was 
natürlich schief geht, weil dein Array nur 31 Elemente groß ist. D.h. 
gets, bzw. dein Benutzer schaffen es mit links, dass sich dein Programm 
selber die Variablen zerschiesst. gets kann dich davor nicht schützen. 
fgets kann es.

gets ist eine Funktion, die es so wie sie ist, nie in den C-Standard 
hätte schaffen sollen. Deine beste Option ist es, völlig zu vergessen 
bzw. zu verdrängen, dass diese Funktion überhaupt existiert. Streiche 
sie aus deinem 'Wortschatz'.
1
    fgets( datei, sizeof(datei), stdin );

von Peter II (Gast)


Lesenswert?

Marcel S. schrieb:
> Ich möchte durch eure Kritik
> dazulernen.

> return (n*100)/anzahl;
ist noch fehlerhaft. Diese Rechnung wird mit int gemacht, damit werden 
hier niemals kommastellen rauskommen. Damit man der Return double keinen 
sinn.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.