Seite 1 von 1

fopen() Speicherzugriffsfehler

Verfasst: Fr Aug 22, 2014 1:12 pm
von Daniel200289
Hallo Leute,
folgendes Problem.

Ich möchte prüfen, ob die Datei beispiel.histfile schon besteht oder nicht, falls sie nicht besteht die Variable histfile=0 setzten, wenn sie besteht, möchte ich deren Inhalt im char-Array ccc2 speichern.
Jedoch hängt sich das Programm in der while-Schleife auf und es kommt: Speicherzugriffsfehler(Speicherabzug geschrieben).
Ich habe mir mal die while-Schleife Schritt für Schritt ausgeben lassen, Endlosschleife mit beliebigen Werten die für p über 100000 gehen, aber wieso?!?
In der Datei stehen maximal 1000 Zeichen. Es passiert sogar, wenn Sie leer ist. Problem besteht übrigens nur unter Linux, unter Windows klappt es einwandfrei.

Code: Alles auswählen

#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <dirent.h>
#include <ctype.h>

FILE *datei;
int p=0;
int histfile;
int b2;
char ccc2[100000];

if(fopen("beispiel.histfile", "r+") == NULL){
		histzahl=0;
	}else{
		
	datei = fopen("beispiel.histfile", "a+");
	
	while ((b2 = fgetc(datei)) != EOF){
    ccc2[p]=b2;
    p++;
	}
	
/* jetzt sollte in ccc2[] der Inhalt der Datei zeichenweise gespeichert sein, unter Windows ist es das auch, unter Linus nicht */
	fclose(datei);
Edit by cloidnerux: Quote-Tags zu Code-Tags

Re: fopen() Speicherzugriffsfehler

Verfasst: Fr Aug 22, 2014 1:49 pm
von cloidnerux
Nach etwas überlegen denke ich, dass es an der unterschiedlichen Implementation von fopen von Windows und Linux liegt, im speziellen mit dem Mode "a+": append/update.
Versuche es doch mal mit den Modi r/r+ wenn du nur Lesen willst.

Bitte bei sowas, wenn es denn geht, ein lauffähiges Programm(mit main) posten, damit man das schnell und einfach testen kann.

Dann vlt noch etwas zum Stil:

Code: Alles auswählen

if(fopen("beispiel.histfile", "r+") == NULL){
      histzahl=0;
   }else{
      
   datei = fopen("beispiel.histfile", "a+");
Du öffnest die Datei zwei mal, das ist unnötig. Mit Wächternkönntest das so schreiben:

Code: Alles auswählen

datei = fopen("beispiel.histfile", "r+");
if (datei == NULL)
    return;
while((b2 = fgetc(datei)) != EOF){...}
Der Vorteil ist die geringere Verschachtelungstiefe und weniger Redundanz(ein fopen eingespart). Letzteres ist wichtig, da du so sonst bei Änderungen leicht etwas übersehen kannst und du transiente Probleme bekommst(Mal funktioniert es, mal nicht).

Re: fopen() Speicherzugriffsfehler

Verfasst: Fr Aug 22, 2014 2:58 pm
von mfro
Der Code ist so, wie er dasteht zwar nicht schön, aber in Ordnung.

Wenn's im richtigen Programm nicht funktioniert, liegt der Fehler in einem nicht gezeigten Teil.

Re: fopen() Speicherzugriffsfehler

Verfasst: Fr Aug 22, 2014 3:03 pm
von Daniel200289
Danke schon mal für eure Hilfe.

Wie gesagt unter Windows klappts auch. Ich hab euch den Teil mal in ein extra Programm geschrieben, mit gcc unter Linux lässt es sich einwandfrei komplimieren, geht jedoch wieder in eine Endlosschleife.

Probierts mal aus:

Code: Alles auswählen

#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <dirent.h>
#include <ctype.h>

int main(){

	FILE *datei;
	int p=0;
	int b2;
	char ccc2[100000];

	datei = fopen("beispiel", "r+");
	
	if (datei == NULL)
    	return;
    
	while((b2 = fgetc(datei)) != EOF){
    	ccc2[p]=b2;
    	printf("C[%d]: %c\n",p,ccc2[p]);
    	p++;
	}
	
	fclose(datei);
}
Damit ihr seht, was passiert, gebe ich in der Schleife den aktuellen Wert von ccc2 aus. Die Datei "beispiel" könnte vom Inhalt so aussehen:

434t3t4
4t34
43fg34g
43gt34g
3g43g43g

(Könnt ihr euch ja kurz anlegen)
Ich verstehe halt nicht, warum es unter Windows klappt und Linux mir da Müll ausgibt. Wer noch eine Idee hat, einfach posten.

Re: fopen() Speicherzugriffsfehler

Verfasst: Fr Aug 22, 2014 3:23 pm
von mfro
Gibt bei mir (Linux) genau das aus, was es soll.

Wenn Du das Ergebnis als String weiterverarbeiten willst, solltest Du nach der Schleife natürlich noch ein Nullbyte als Endekennzeichen dranhängen, sonst geht's schief:

Code: Alles auswählen

ccc2[p] = '\0';