fopen() Speicherzugriffsfehler

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Daniel200289
Beiträge: 20
Registriert: Mo Aug 11, 2014 12:17 pm

fopen() Speicherzugriffsfehler

Beitrag von Daniel200289 » Fr Aug 22, 2014 1:12 pm

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

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: fopen() Speicherzugriffsfehler

Beitrag von cloidnerux » Fr Aug 22, 2014 1:49 pm

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).
Redundanz macht wiederholen unnötig.
quod erat expectandum

mfro
Beiträge: 346
Registriert: Mi Jan 16, 2013 4:58 pm

Re: fopen() Speicherzugriffsfehler

Beitrag von mfro » Fr Aug 22, 2014 2:58 pm

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.
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

Daniel200289
Beiträge: 20
Registriert: Mo Aug 11, 2014 12:17 pm

Re: fopen() Speicherzugriffsfehler

Beitrag von Daniel200289 » Fr Aug 22, 2014 3:03 pm

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.

mfro
Beiträge: 346
Registriert: Mi Jan 16, 2013 4:58 pm

Re: fopen() Speicherzugriffsfehler

Beitrag von mfro » Fr Aug 22, 2014 3:23 pm

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';
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

Antworten