Array aus FILE-Zeigern



  • Hallo,

    ich erstelle ein Array aus FILFE-Zeigern und moechte dann durch dieses iterieren, um aus allen Dateien zu lesen, dazu hbae ich folgenden Code geschrieben

    int main(int argc, char** argv)
    {
    ...
    
    	//Variablendeklaration
    	FILE**	pfSource	= (FILE**) malloc( (argc-1)*sizeof(FILE) );	
    	int	iFLength	= 0;						
    
    	//oeffne die angegebenen Dateien, speichere in pfSource
    	for (int i = 1 ; i < argc; i++) {
    		if ( (pfSource[i] = fopen(argv[i], "r+")) == NULL)
    			return 1;
    	}
    	iFLength	= argc-1;
    
    	//ermittle die Laenge und Anzahl der Zeilen
    	int	iWidth	= 0;
    	int	iLength	= 0;
    	if (!bReadHeader(pfSource, iFLength, &iWidth, &iLength))
    		return 1;
    
    }
    
    bool bReadHeader( FILE** const pfSource, const int iFLength, int* iLength, int* iRow)
    {
    	//Variablendeklaration
    	int		iTlength = 0;
    	int		iTrow	 = 0;
    	char*	pcM		 = (char*) malloc(3*sizeof(char));
    
    	//Headerdaten einlesen u. Ueberpruefung der Werte
    	for (int i = 0; i < iFLength; i++) {
    		if ( (3 != fscanf(pfSource[i], "%2s %4u %4u", pcM, &iTlength, &iTrow)))
    			return false;
    ...
    	}
    
    	return true;
    }
    

    Der Aufruf von fscanf() in bReadHeader() erzeugt eine Zugriffsverletzung. Mein Debugger, der mich durch diese Unmenge von Unterfunktionen von fscanf() schleift, hat mir nur insoweit weitergeholfe, dass ich weiss, dass etwas mit 'FILE **pfSource' nicht stimmt. Nun bin ich mir nicht sicher: fopen gibt ja Adressen von 'FILE' Strukturen, daher muesste ich sie doch problemlos als Werte eines Arrays speicher koennen. Ich weiss nicht, ob bei 'pfSource[i]' nicht zufaellig diese FILE-Adressen dereferenziert werden (ich denke nicht).

    Habt ihr vielleicht eine Idee, was der Fehler ist?

    Gruss,
    caspar



  • sizeof(FILE*) muss es heissen
    wieso gibst du "laengen" bei fscanf an? mach die raus.



  • Vielen Dank, das war ein Fehler. Konsequenter Weise habe ich gleich einen zweiten Fheler eingebaut (🕶 / 🤡):

    if ( (pfSource[i] = fopen(argv[i], "r+")) == NULL)
                return 1;
    

    nicht laeuft, da for i main() bei i=1 anfaengt zu zaehlen, und in bReadHeader die for-Schleife 'i = 0' initialisiert. Also

    if ( (pfSource[(i-1)] = fopen(argv[i], "r+")) == NULL)
                return 1;
    

Anmelden zum Antworten