[C] Einlesen von Daten aus Textdokumenten

DAmico

Mitglied
Hey Leute,

ich möchte gerne ein Programm schreiben, was aus einer Textdatei Zahlen einließt und jede Zahl in einen Integer einließt, damit ich mit diesen Zahlen rechnen kann.
Das Textdokument heißt eingabe.txt und sieht z.B. folgendermaßen aus:
13 (Leerzeile) 2
125 (Leerzeile) 13

Jetzt möchte ich gerne mit den Zahlen aus jeweils einer Zeile Rechenoperationen durchführen,
wie schaffe ich es nun die einzelnen Zahlen jeder Zeile in einen Integer einzulesen?

C++:
#include <stdio.h>
#include <math.h>

int main()
{
int z;
FILE *pDatei = fopen("eingabe.txt", "r+t");


z=fgetc(pDatei);

while(!feof(pDatei)) //So ist es ja möglich mir alle Zahlen des Dokuments darzustellen,
{                    // aber ich möchte ja jeweils die einzelnen Zahlen in einen Integer einlesen.
	putchar(z);
	z = fgetc(pDatei);
}

fclose(pDatei);
return 0;
}

Nochmal meine Frage zum Ende:
Wie kann ich die einzelnen Zahlen in meinem Textdokument als Integer einlesen?
Ich hoffe ihr könnt mir helfen. :)

Mit freundlichen Grüßen
 
Dankeschön für die schnelle Antwort. :)

Hier nun der Code:
C++:
#include <stdio.h>
#include <math.h>

int main()
{

int z;
int b;

FILE *pDatei = fopen("eingabe.txt", "r+t");
FILE *pDatei1 = fopen("ausgabe.txt", "w+t");

do
{
fscanf(pDatei,"%d",&z);
fprintf(pDatei1,"%d", z);
fscanf(pDatei,"%d",&b);
fprintf(pDatei1,"%d\n", b);

//...

}while(!feof(pDatei));

fclose(pDatei);
fclose(pDatei1);
return 0;
}

Folgendes Problem habe ich noch:
Wenn ich jetzt in meinem eingabe.txt stehen habe:
5 (Leertaste) 2
15 (Leertaste) 5
Dann schreibt er mir in meinen ausgabe.txt:
52
155

Nun möchte ich aber, dass statt 52 dort 5(leertaste)2 steht.
Wie schaffe ich es jetzt, dass ich zwischen den beiden Zahlen in einer Zeile eine Leertaste einfüge?
Es gibt ja in C keine Escape Sequenz, die eine Leertaste weiter rückt?

Ich hoffe ihr könnt mir helfen. :)

Mit freundlichen Grüßen
 
Wie schaffe ich es jetzt, dass ich zwischen den beiden Zahlen in einer Zeile eine Leertaste einfüge?
Indem du einfach ein Leerzeichen einfügst... ;-]
C:
printf("%d ", z);
Übrigens solltest du prüfen ob du überhaupt etwas eingelesen hast.

Und wenn die Datei zeilenweise aufgebaut ist, dann lies doch auch einfach zeilenweise (mit fgets) ein und verarbeite dann jede Zeile mit sscanf.

C:
char line[500];

while (fgets(pDatei, 500, line) != NULL) {
  int a, b;

  if (sscanf(line, "%d %d", &a, &b) == 2) {
    fprintf(pDatei1,"%d %d\n", a, b);
  } else {
    // fehlerhafte Eingabe...
  }
}
Gruß
 
Zuletzt bearbeitet:
Dankeschön für den klasse Tipp.

Hab jetzt auch probiert in den Quelltext eine Abfrage einzubaun, die überprüft, ob überhaupt etwas in meiem eingabe.txt steht:
C++:
#include <stdio.h>
#include <math.h>

int main()
{

int z;
int b;

FILE *pDatei = NULL;
pDatei = fopen("eingabe.txt","r+t");

if(pDatei == NULL) {
fprintf(stderr,"Konnte Datei eingabe.txt nicht öffnen!\n");
return 1;
}

FILE *pDatei1 = fopen("ausgabe.txt", "w+t");


do
{
fscanf(pDatei,"%d",&z);
fprintf(pDatei1,"%d ", z);
fscanf(pDatei,"%d",&b);
fprintf(pDatei1,"%d ", b);

//...
	
}while(!feof(pDatei));

fclose(pDatei);
fclose(pDatei1);

return 0;
}

Wenn ich das Programm starte, funktioniert es nicht mehr.
Dies liegt aber nicht an der in Zeile 13 eingebauten if-Schleife (hab sie extern überprüft),
sonder er bringt mir einige Fehlermeldungen im Zusammenhang mit pDatei1, nämlich dass dieser ein nichtdeklarierter Bezeichner sei.

Eine Frage zu deinem Quellcode:
C++:
if (sscanf(line, "%d %d", &a, &b) == 2)
Bedeutet diese 2, dass die Zeile sozusagen nur gültig ist, wenn sich 2 Argumente, sprich Zahlen, in dieser befinden?

Die Idee die ganze Geschichte zeilenweise abzuarbeiten finde ich eine klasse Idee,
woltte diese auch in mein Programm einbauen, aber da bringt er mir die Fehlermeldung, dass
fgets nicht genügend Argumente für den Aufruf besitzt.

Wie kann man nun diese Fehler beheben?

MIt freundlichen Grüßen:)
 
Und die Sache mit dem fgets:
Statt
fgets(pDatei, line)
schreibst du
fgets(line,500,pDatei);
wobei 500 die Maximallänge pro Zeile ist.
In deepthroats Beispiel wäre es eben 500
 
Dankeschön für die Hinweis mit dem fgets. :)
Die Schleife funktioniert nun einwandfrei.

Nur warum bekomme ich die Fehlermeldungen mit meinem Pointer pDatei1 als nichtdeklarierter Bezeichner,
wenn ich die Schleife, die überprüft ob das Textdokument eingabe.txt existiert, einbaue?

Mit freundlichen Grüßen
 
Der Code sieht wie folgt aus:

C++:
#include <stdio.h>
#include <math.h>

int main()
{
int a = 1;
int z ,b;

FILE *pDatei = NULL;
pDatei = fopen("eingabe.txt","r+t");
 
if(pDatei == NULL) {
fprintf(stderr,"Konnte Datei eingabe.txt nicht öffnen!\n");
return 1;
}
FILE *pDatei1 = fopen("ausgabe.txt", "w+t");

char line[500];
 
while (fgets(line,500,pDatei) != NULL) 
{
   
  if (sscanf(line, "%d %d", &z, &b) == 2) 
	{
    fprintf(pDatei1,"%d %d ", z, b);
	if (((int)pow(b, z-1) % z) == 1)
		fprintf(pDatei1,"Die Zahl %i ist eine Pseudoprimzahl\n", z);
	else
		fprintf(pDatei1,"Die Zahl %i ist keine Primzahl\n", z);
	} 
  else 
	{
    printf("Die %dte Zeile in eingabe.txt ist fehlerhaft\n", a);
	}
  a++;
}

fclose(pDatei);
fclose(pDatei1);

return 0;
}

Lasse ich die if-Schleife die im Quelltext in den Zeilen 12-15 steht weg,
dann funktioniert das Programm einwandfrei.
Was stimmt mit dieser Schleife nicht?

Mit freundlichen Grüßen
 
Zurück