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;