C: TXT in 2d Array einlesen?

eheimwbn

Grünschnabel
Hallo Ihr Leut,

ich mache gerade einen C Anfängerkurs und Teil meiner aktuellen Aufgabe ist es aus einer '.txt' Datei Zahlen einzulesen und diese in einem 2d Array zu speichern...

Und ich hab wirklich null Ahnung wie das gehen sollte...

C++:
int Tipp[S][ C] = 
	{
		{1, 2, 3, 4, 5, 6},
		{7, 8, 9,10,11,12},
		{13,14,15,16,17,18},
		{24,23,22,21,20,19},
		{25,26,27,28,29,30},
		{36,35,34,33,32,31},
		{37,38,39,40,41,42},
		{48,47,46,45,44,43},
		{49, 7,28, 9,19, 1},
		{ 6, 7,38, 9,19,21},
		{ 6, 7,48,19,19,13},
		{ 6, 7,28,29, 2,17}
	};
Ist mein Array... wie bitte lese ich aus einer Datei so ein, dass er mir die Zuordnungen auch sauber macht?

Ich bin für jede Hilfe dankbar!
 
Zuletzt bearbeitet von einem Moderator:
Hallo

Ist der Array so gegeben oder ist das dein Lösungsansatz?
Was ist denn konkret die Aufgabe?
Wie ist die Datei aufgebaut (z.B. zeilenweise Trennung, Kommas, ...) ?
Mir ist nicht ganz klar, weshalb man dafür einen zweidimensionalen Array braucht, ein eindimensionaler reicht doch?

Was ist 'S', was 'C'? Hast du noch mehr Code?

Liebe Grüsse
cwriter
 
Servus,

es soll ein 'Lotto' Programm sein und in dem Array sollen die 12x6 Zahlen der getippten Zahlen gespeichert sein.

Vorgabe ist diese Zahlen als 2d Array einzulesen und dann mit den eingegeben Zahlen zu vergleichen und sie auf der Konsole auszugeben.



der ganze Quellcode...
http://pastebin.com/stZnKRHa
 
Ok, da kein spezielles Dateilayout gewünscht ist, kreiere ich einfach eines :)
Code:
1,2,3,4,5,6
7,8,9,10,11,12
13,14,15,16,17,18
24,23,22,21,20,19
25,26,27,28,29,30
36,35,34,33,32,31
37,38,39,40,41,42
48,47,46,45,44,43
49,7,28,9,19,1
6,7,38,9,19,21
6,7,48,19,19,13
6,7,28,29,2,17
So: Die einzelnen Zahlen sind jetzt durch Kommas, die 6er-Blöcke durch das Zeichen "\n" getrennt.
Nun zum Code:
C:
int OpenLottoFile(char* name,int Ziel[12][6])
{
FILE* f = fopen(name,"r");
if(f == NULL) return -1;
char temp[64]; //temporäre Variable, darf nicht kleiner sein als die maximale Zeilenlänge
int i = 0; //Wir brauchen einen Zeilenzähler
while(fgets(temp,64,f) != NULL) //Wir lesen die Datei zeilenweise, d.h. die einzelnen Sätze
{
char* pch = strtok(temp,","); //Eventuell nach jeder strtok()-Anweisung überprüfen, ob der Pointer nicht NULL ist
Ziel[i][0] = atoi(pch);
pch = strtok(NULL,",");
Ziel[i][1] = atoi(pch);
pch = strtok(NULL,",");
Ziel[i][2] = atoi(pch);
pch = strtok(NULL,",");
Ziel[i][3] = atoi(pch);
pch = strtok(NULL,",");
Ziel[i][4] = atoi(pch);
pch = strtok(NULL,"\n");
Ziel[i][5] = atoi(pch);

i++; //So, nächste Zeile
}
fclose(f);
return 0;
}
Komplett aus dem Kopf aufgeschrieben; ungetestet.

cwriter
 
Zuletzt bearbeitet:
Gerngeschehen :)

Einige Kleinigkeiten gilt es allerdings zu beachten:
1) Am Schluss muss es eine leere Zeile haben
2) Die Syntax darf nicht durchbrochen werden -> Zeiger auf NULL -> Absturz.

Ein klein wenig verbesserter Code inkl. Darstellung:
C:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int OpenLottoFile(char* name,int Ziel[12][6])
{
	FILE* f = fopen(name,"r");
	if(f == NULL) return -1;
	char temp[64]; //temporäre Variable, darf nicht kleiner sein als die maximale Zeilenlänge
	int i = 0; //Wir brauchen einen Zeilenzähler
	while(fgets(temp,64,f) != NULL) //Wir lesen die Datei zeilenweise, d.h. die einzelnen Sätze
	{
		char* pch = strtok(temp,","); //Eventuell nach jeder strtok()-Anweisung überprüfen, ob der Pointer nicht NULL ist
		if(pch == NULL) continue;
		Ziel[i][0] = atoi(pch);
		pch = strtok(NULL,",");
		if(pch == NULL) continue;
		Ziel[i][1] = atoi(pch);
		pch = strtok(NULL,",");
		if(pch == NULL) continue;
		Ziel[i][2] = atoi(pch);
		pch = strtok(NULL,",");
		if(pch == NULL) continue;
		Ziel[i][3] = atoi(pch);
		pch = strtok(NULL,",");
		if(pch == NULL) continue;
		Ziel[i][4] = atoi(pch);
		pch = strtok(NULL,"\n");
		if(pch == NULL) continue;
		Ziel[i][5] = atoi(pch);
		 
		i++; //So, nächste Zeile
	}
	fclose(f);
	return 0;
}

int main(int argc, char* argv[])
{
	int Ziel[12][6];
	OpenLottoFile("Test.txt",Ziel);
	int i = 0;
	int ii= 0;
	while(i != 12)
	{
		while(ii != 6)
		{
			printf("%d",Ziel[i][ii]);
			if(ii != 5) printf(",");
			ii++;
		}
		printf("\n");
		ii = 0;
		i++;
	}
	
	system("PAUSE");
	return 0;
}

cwriter
 

Neue Beiträge

Zurück