You are not logged in.

  • Login

1

Wednesday, January 6th 2010, 2:36pm

Zahlen aus Datei lesen und Verarbeiten

Hallo,

ich habe folgendes kleines Problem. Ich habe eine Datei mit einer Zahl pro Zeile.
Die ersten beiden Zahlen ergeben Spalten und Zeilen einer Matrix. Wenn also 3 und 4 die ersten Zahlen sind währe es eine 3x4 Matrix.
Alle Zahlen danach sind Double werte und Inhalt der Matrix. Ich möchte nun diese Datei einlesen, und anschließend Spalte und Zeile angeben.
Die Zahl möchte ich sehen und entscheiden ob ich sie ändern will.
So ich kann schon einlesen und hab schon das eingelesene in Double konvertiert. Mir fällt aber grad nicht ein wie ich die ersten beiden Zahlen überspringen
könnte. Außerdem wüsst ich grad nicht wie ich das ganze dann zurückspeichere.
Ich würde das auch gern als Array oder direkt im File aber nicht als Matrix machen.
Hier erstmal mein bissheriges

C/C++ Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <stdlib.h>
 
int main(int argc, char *argv[]) {
char eingabe[20];
char name;
char puffer[500];
 
FILE *fp;
 
if (argv[1] == NULL) {
printf("Gib einen Dateinamen an \n");
scanf("%s", eingabe);
 }
 
else {
strcpy(eingabe, argv[1]);
}
 
if ((fp = fopen (eingabe,"r")) == NULL){ 
printf("Fehler beim Öffnen der Datei\n"); 
exit(1);
}
 
while(fgets(puffer, sizeof(puffer), fp) != NULL){
 
double matrix = atof(puffer);
printf("Pufferinhalt: %f", matrix);
printf("Pufferinhalt: %s", puffer);
 
}
 
fclose (fp);
 
system("pause");
 
return 0;
 
}

Jemand Ideen?

Grüße Roman

This post has been edited 2 times, last edit by "ul7ima" (Jan 7th 2010, 7:23am)


2

Thursday, January 7th 2010, 7:43am

Vielleicht das Problem nicht genau genug beschrieben?

Also nochmal zu meinem Problem,

ich weiß jetzt nicht wie ich auf die eingelesenen Zahlen zugreifen kann.
Muss ich die erst mit einer Schleife in ein Array schreiben? Wie genau? Mit Zeiger?
Ich hab da auch irgendwie kein passendes Beispiel gefunden wo ich das Prinzip verstehen könnte.

Währ cool wenn sich jemand erbarmen könnte ;>

Grüße

3

Thursday, January 7th 2010, 1:33pm

Es reicht wenn du die ersten Zeilen einfach ausliest und damit erfährst wie groß die Matrix sein soll. Danach kannst du ein zweidimensionales Array alloziieren und die Werte da rein speichern. Das ist schon der ganze Trick dabei :)

Wie die Datei zeilenweise ausgelesen werden kann steht bei dir bereits im Quelltext:

Source code

1
fgets(puffer, sizeof(puffer), fp)


Nur eben ohne die Schleife ... warum auch, wenn du nur jeweils einen Wert willst?

Zum weiterlesen:
* http://www.cplusplus.com/reference/clibrary/cstdio/fgets/
* http://www.cplusplus.com/reference/clibrary/cstdlib/malloc/
* http://www.google.de/search?q=2d%20array%20malloc

Achja: wenn du erwartest dass dir jemand einen kompletten Quelltext hinstellt ... evtl. macht das jemand sogar, aber davon hätte keiner was. Hausaufgaben macht man am besten selbst ;)

4

Thursday, January 7th 2010, 3:00pm

Hallo,

ok vielen Dank erstmal. Habe jetzt die Spalten und Zeilen eingelesen.
Aber das war ne alte Klausur aufgabe und ich möchte die als Vorbereitung machen.
Und da sollte man das ohne Matrix machen.

Wie kann ich an eine bestimmte Stelle von der Datei etwas einfügen? Also z.B. die 6.Spalte ersetzten?
Sicher mit puts oder so ... aber wie halt an der bestimmten Stelle?

5

Thursday, January 7th 2010, 4:26pm

In eine existierende Datei etwas einfügen?

Du erstellst, eventuell nur temporär, eine weitere Datei und kopierst die Daten der existierenden Datei z.B. bis Zeile 6 - fügst dann deine neuen Daten ein - und dann kopierste ab Zeile 7 weiter, in die weitere Datei. Wie du anschliessend welche Datei umbenennst und/oder löscht bekommst du sicher selbst heraus. Es gibt da nicht nur eine Variante.

Viel Spass bei üben
bcc-fan

6

Saturday, January 9th 2010, 7:32pm

Was ist hier Falsch?

Hallo ich verstehe das nicht ganz. Habe das jetzt so weit zusammengebastelt.
An der Stelle wo ich Abfrage ob man die Zahl ändern will macht der nur noch kacke.
Der liest das j oder n nicht ein. Da ließt er irgendwas. Hab auch schon anderes Probiert.
Auch liest er danach den Double wert Falsch...warum?

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(char argc, char *argv[]) {
  char eingabe[20];
  int zeingabe;
  char name;
  char puffer[500];
  double neuezahl; 
  int spalten, spaltenb;
  int zeilen, zeilenb;
  int zaehler = 1;
  int weiter = 0, ende = 0;
  int zahl;
  int i=1;
  int k, elementenzahl, position;

  
  FILE *fp;
  
  if (argv[1] == NULL) {
	printf("Gib einen Dateinamen an \n");
	scanf("%s", eingabe);
		}
	
	else {
	strcpy(eingabe, argv[1]);
	}
  
  while (ende != 1){
  
  if ((fp = fopen (eingabe,"r+")) == NULL){  
      	printf("Fehler beim Öffnen der Datei\n"); 
      	exit(1);
      	}
  
  fgets(puffer, sizeof(puffer), fp);
  printf("Anzahl der Zeilen ist: %s",puffer);
  zeilen = atoi(puffer);
  
  fgets(puffer, sizeof(puffer), fp);
  printf("Anzahl der Spalten ist: %s",puffer);
  spalten = atoi(puffer);

  k = spalten*zeilen+2;
  elementenzahl = k;
  
  char speicher[k];
  speicher[1]=zeilen;
  speicher[2]=spalten;
  elementenzahl -= 2;
  position = 3;
  
  while (weiter != 1){
  printf("Geben Sie bitte die Zeile an:\n");
  	scanf("%i", &zeingabe);

  	if(zeingabe <1 || zeingabe > zeilen){
           	printf("Geben Sie bitte Zahl im gültigen Bereich an!\n");
           	}
   	else{
     	zeilenb = zeingabe;
     	weiter = 1;
     	}  
              	}
              	
              	
   weiter = 0;
        	
	while (weiter != 1){
      	printf("Geben Sie bitte die Spanlte an:\n");
  	  	scanf("%d", &zeingabe);
  	
                  	if(zeingabe <1 || zeingabe > spalten){
                  	printf("Geben Sie bitte Zahl im gültigen Bereich an!\n");
                  	}
                  	
                  	else{
                  	spaltenb = zeingabe;
                  	weiter = 1;
                  	}  
   }		
                     	
  weiter = 0;
  	       	
  zahl = (zeilenb-1)*spalten+(spaltenb-1)+2; 
  
  while(i != zahl-1){
  	
    	fgets(puffer, sizeof(puffer), fp);
    	double inhalt = atof(puffer);
    	speicher[position] = inhalt;
    	i++;
    	elementenzahl--;
    	position++;
    	}
    	
    	fgets(puffer, sizeof(puffer), fp);
    	double inhalt = atof(puffer);
    	char c;
    	printf("Ausgewaehltes Element: %f \n", inhalt);
    	
    	printf("Soll die Zahl geaendert werden? j/n \n");
    		printf("%c",c);
    		c = 'j';
    		printf("%c",c);
        	scanf("%c", &c);
        	if (c == 'n'){
          	fclose(fp);
          	ende = 1;
          	}
          	
         	else{
                         	
          	printf("Hoe hab doch gar nix gemacht\n");                  	
          	printf("Geben sie eine neue Zahl ein:\n");
 	      	scanf("%f", &neuezahl);
          	printf("Die neue Zahl ist: %f\n",neuezahl);  
 	      	speicher[position] = neuezahl;
 	      	
          	elementenzahl--;
          	position++;

          	}
          	
          	while(elementenzahl > 0){
               	fgets(puffer, sizeof(puffer), fp);
               	double inhalt = atof(puffer);
               	speicher[position] = inhalt;
               	printf("Bis zu ende Kopieren: %s",speicher[position]);
               	position++; 
               	elementenzahl--;
                  	}  	

          	
      	if ((fp = fopen (eingabe,"w")) == NULL){ 
         	printf("Fehler beim Speichern der Daten\n"); 
         	exit(1);
      	}
      	elementenzahl = 1;
      	
      	while (position > 0){
            	neuezahl = speicher[elementenzahl];
            	fprintf(fp ,"%f",neuezahl);
            	elementenzahl++;
            	position--;
            	}
            	
      	
    	printf("Soll noch eine Zahl geändert werden? j/n\n");   
        	scanf("%c", &c);
        	
       	if ('n' == c) {
          	close(fp);
          	ende = 1;
          	}
}

return 0;
  
}

7

Saturday, January 9th 2010, 9:53pm

Du solltest nicht soviel Quelltext in main hinein packen sondern das Ganze auf mehrere kleinere in der Regel übersichtliche Funktionen verteilen.
Mit der Formatierung geht es meiner Ansicht auch noch übersichtlicher ;)

Ich hab es nur überflogen:
die Zeilen

C/C++ Quellcode

1
scanf("%c", &c)

machen oft nicht das was der Autor will - da kann man sich seitenweise im Internet vergnügen - das Dumme ist, das die Lösungen manchmal funktionieren, aber nicht immer zuverlässig sind.

Vielleicht hat ja folgende Lösung auch noch einen Haken:

C/C++ Quellcode

1
scanf("%1s", &c)

mir ist aber noch keiner bekannt.

Hab es nicht getestet, hoffe das ich keinen Zeichendreher eingebaut habe.

Nachtrag: nimm die C&C++ Tags für den Quelltext 8)

MfG bcc-fan

8

Sunday, January 10th 2010, 10:23pm

habs gelöst. Danke.

Similar threads

Social bookmarks