Probleme beim einlesen mit fscanf

Assanur

Grünschnabel
hallo liebe community, für eine Studienarbeit muss ich eine 103x103 Matrix aus einer .txt Datei in ein Array[x][y] einlesen. Zur kontrolle möchte ich die eingelesenen Werte in eine Prüfdatei schreiben und in der Konsole anzeigen.

Code:
void Datei_Spot_einlesen(char *Datei_Spot, double spot[][SPOTSPALTEN])
{
	int Zeilen = 0, Spalten = 0; 
	FILE *DS_einlesen; 
	FILE *DS_ausgabe;
	
	cout << "Einlesen der Spot-Datei beginnt." <<endl;

	DS_einlesen = fopen(Datei_Spot, "r"); 
		for (Zeilen=0 ; Zeilen <= 102; Zeilen++)
	{
		fscanf_s(DS_einlesen, "%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\n",&spot[Zeilen][0],&spot[Zeilen][1],&spot[Zeilen][2],&spot[Zeilen][3],&spot[Zeilen][4],&spot[Zeilen][5],&spot[Zeilen][6],&spot[Zeilen][7],&spot[Zeilen][8],&spot[Zeilen][9],&spot[Zeilen][10],&spot[Zeilen][11],&spot[Zeilen][12],&spot[Zeilen][13],&spot[Zeilen][14],&spot[Zeilen][15],&spot[Zeilen][16],&spot[Zeilen][17],&spot[Zeilen][18],&spot[Zeilen][19],&spot[Zeilen][20],&spot[Zeilen][21],&spot[Zeilen][22],&spot[Zeilen][23],&spot[Zeilen][24],&spot[Zeilen][25],&spot[Zeilen][26],&spot[Zeilen][27],&spot[Zeilen][28],&spot[Zeilen][29],&spot[Zeilen][30],&spot[Zeilen][31],&spot[Zeilen][32],&spot[Zeilen][33],&spot[Zeilen][34],&spot[Zeilen][35],&spot[Zeilen][36],&spot[Zeilen][37],&spot[Zeilen][38],&spot[Zeilen][39],&spot[Zeilen][40],&spot[Zeilen][41],&spot[Zeilen][42],&spot[Zeilen][43],&spot[Zeilen][44],&spot[Zeilen][45],&spot[Zeilen][46],&spot[Zeilen][47],&spot[Zeilen][48],&spot[Zeilen][49],&spot[Zeilen][50],&spot[Zeilen][51],&spot[Zeilen][52],&spot[Zeilen][53],&spot[Zeilen][54],&spot[Zeilen][55],&spot[Zeilen][56],&spot[Zeilen][57],&spot[Zeilen][58],&spot[Zeilen][59],&spot[Zeilen][60],&spot[Zeilen][61],&spot[Zeilen][62],&spot[Zeilen][63],&spot[Zeilen][64],&spot[Zeilen][65],&spot[Zeilen][66],&spot[Zeilen][67],&spot[Zeilen][68],&spot[Zeilen][69],&spot[Zeilen][70],&spot[Zeilen][71],&spot[Zeilen][72],&spot[Zeilen][73],&spot[Zeilen][74],&spot[Zeilen][75],&spot[Zeilen][76],&spot[Zeilen][77],&spot[Zeilen][78],&spot[Zeilen][79],&spot[Zeilen][80],&spot[Zeilen][81],&spot[Zeilen][82],&spot[Zeilen][83],&spot[Zeilen][84],&spot[Zeilen][85],&spot[Zeilen][86],&spot[Zeilen][87],&spot[Zeilen][88],&spot[Zeilen][89],&spot[Zeilen][90],&spot[Zeilen][91],&spot[Zeilen][92],&spot[Zeilen][93],&spot[Zeilen][94],&spot[Zeilen][95],&spot[Zeilen][96],&spot[Zeilen][97],&spot[Zeilen][98],&spot[Zeilen][99],&spot[Zeilen][100],&spot[Zeilen][101],&spot[Zeilen][102]);
	}//for (Zeilen...
	Zeilen = 0; //zurücksetzten des Integer Zeilen auf 0
		fclose(DS_einlesen); 
		
	DS_ausgabe=fopen("zwischenstand.txt", "w"); 
	for (Zeilen=0; Zeilen <= 102; Zeilen++)
	{
		for (Spalten=0; Spalten <= 102; Spalten++)
		{
			cout << ("\t%lf", spot[Zeilen][Spalten]); 
			fprintf_s(DS_ausgabe, "%lf\t", spot[Zeilen][Spalten]); 
		}//for Spalten...
		cout << "\n" << endl;
		fprintf_s(DS_ausgabe, "\n"); 
	}//for (Zeilen...
	fclose(DS_ausgabe);
	
	cout << "Einlesen der Spot-Datei beendet." <<endl; 
}

wie man sieht hab ich das bisher mit fscanf gelöst, da ich mich mit den ganzen stream-Sachen nicht sonderlich auskenne und fscanf bisher immer gut funktioniert hat

mein problem ist jetzt aber, das die ausgelesenen Zahlen nicht die aus der Datei sind (liegen so zwischen 0 und 500 und sind mit TAB getrennt; wie gesagt 103 spalten und 103 Zeilen) sondern Werte in dieser größe: -92559631349317831000000000000000000000000000000000000000000000.000000
da ich so einen Fehler noch nie gehabt habe bin ich mitlerweile schon ziemlich verzweifelt
 
Zuletzt bearbeitet:
C++ like? :P
C++:
#include <iostream>
#include <algorithm>
#include <iterator>
#include <fstream>

typedef value_type long;

int main()
{
    std::ifstream file_stream("source.txt");
    if (!file_stream) return 1;

    value_type data[103 * 103];
    std::copy(std::istream_iterator<value_type>(file_stream), std::istream_iterator<value_type>(), data);

    // Zugriff: Zeile * 103 + Spalte
    std::clog << "data[10][5] = " << data[10 * 103 + 5] << std::endl;
}
 
so hab das jetzt ausprobiert und es funktioniert soweit, aber ich hab immer noch das gleiche Problem das das Ergebnis von einer eingelesenen 0 eine Zahl ist die etwa -847934290032 oder so ähnlich ist

kann es daran liegen das die .txt datei aus Excel exportiert ist?
 
Zuletzt bearbeitet:
Juhuu, habe jetzt den value type nicht als long sondern als float deklariert und jetzt funktioniert es, gaanz großes Danke an devDevil

kann ich die Matrix so dann auch in anderen Unterfunktionen aufrufen?
 
Hallo,

wie die obrigen Posts schon sagen hab ich vor einiger Zeit eine Lösung für das Einlesen einer großen Matrix gesucht, und dank devDevil auch gefunden :D

Die Lösung von devDevil hat auch wunderbar funktioniert, bis ich vor kurzem meinen Rechner neu aufgesetzt habe. Ich habe NICHTS an meinem Code geändert und arbeite wie zuvor mit Microsoft Visual Studio 2005 Professional.
Allerdings wenn ich das Programm jetzt laufen lasse, bricht er mir genau bei dieser Zeile ab:

Code:
 std::copy(std::istream_iterator<value_type>(file_stream), std::istream_iterator<value_type>(), data);

Es folgt diese Meldung:
Unbehandelte Ausnahme bei 0xc225999a in SimulationT2.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0xc225999a.

also ->Unterbrechen klicken

dann erhalte ich diese Meldung:
Es sind keine Symbole für Aufruflistenrahmen geladen. Der Quellcode kann nicht angezeigt werden.

und das Angebot das Disassembly anzeigen zu lassen, dort werden mir nur Fragezeichen gezeigt, und ich kann damit leider überhaupt nichts anfangen.

Visual Studio zeigt mir keine Fehler an, lediglich die Meldung, dass
Code:
std::_Copy_opt
als veraltet deklariert wurde. Einmal hatte ich auch schon die Meldung das der Einstiegspunkt nicht eindeutig definiert ist, doch auch das sagt mir als Programmieranfänger (bin in C++ nicht sehr bewandert) leider nichts.

ich hoffe hier kann mir jemand helfen, denn ich verzweifle langsam

Gruß Assanur


P.S.: kann es daran liegen, dass ich die Visual Studio Zusatz-Bibliotheken installiert habe, die hatte ich nämlich vorm Neuaufsetzten nicht.
 
Zurück