Seite 1 von 1

Datei nächste Zeile

Verfasst: Mi Jul 25, 2018 4:14 pm
von rudzan
Hallo,
Seit Wochen lerne und beschäftige ich mich mit Programiersprache "C", vielleicht kann mir jmd bei der unten gestellten Aufgabe weiterhelfen?
Eine Textdatei hat am Anfang eine Zahl (Stunden), dann eine Leertaste, ein Datum, eine Leertaste und dann noch einen belieben Text:
00,75 14.11.2017 Bier holen
02,20 18.11.2017 Latten lackieren
01,50 25.11.2017 Gerüst aufstellen

Nun möchte ich von dieser Textdatei nur die ersten 5 Zeichen (Stunden) auf den Bildschirm printen.
Stunden: 00,75
Stunden: 02,20
Stunden: 01,50

Mit den unten angegebenen Programm kann ich die ersten 5 Zeichen lesen, aber wie komme ich auf die nächste Zeile?

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>

int main () {
	FILE *fptr;
	fptr = fopen ("std.txt", "r");
	if(fptr == 0)
	{
		printf("konnte nicht oeffnen!\n");
		exit(1);
	}
	char array[70];
	for(int i = 0; i < 5; i++)
	{
		array[i] = fgetc(fptr);
	}
	printf("\nStunden: %s\n", array);
	fclose(fptr);
   return(0);
}
Ich hoffe ihr könnt mir weiterhelfen,
Grüsse, Rudolf

Mein Werkzeug: Linux Ubuntu 64Bit, Compiler gcc

Re: Datei nächste Zeile

Verfasst: Mi Jul 25, 2018 4:55 pm
von Xin
Ich antworte erstmal offen: In dem Du solange Zeichen liest, bis Du ein Zeile-Ende Zeichen erkennst. Also eine For-Schleife. Lass Dir die Zeichen mal ausgeben und schau Dir an, welche Zeichen vor der nächsten Zeile kommen.

Und vielleicht hilft Dir fgets() das ganze zu vereinfachen.

Re: Datei nächste Zeile

Verfasst: Mi Jul 25, 2018 5:38 pm
von nufan
Es ist eine schöne Anfängeraufgabe das Format händisch zu parsen. Für Daten mit fixem Format kannst du dir mit fscanf() aber einiges an Arbeit ersparen. Man sollte sich aber der Fehlerquellen bewusst sein.

Re: Datei nächste Zeile

Verfasst: Do Jul 26, 2018 3:55 pm
von rudzan
Vielen Dank für eure Antworten!
@Xin: Ja, es ist die Zahl 10 die immer am Ende oder am Anfang eines Satzes in der Textdatei steht. Mit dieser Zahl habe ich solange herumprobiert bis ich es geschafft habe, nun kann ich also meine Stunden mit den unten stehenden Code wie gewünscht auflisten:

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>

FILE *fptr;
void fileOpen(char *);

int main () 
{
	int ch = 0;
	int line = 0;
	fileOpen("std.txt"); //Datei erstes mal oeffnen
	ch = fgetc(fptr);
	//zaehlt wieviele Zehner vorhanden sind:
	while(!feof(fptr))
	{
		ch = fgetc(fptr);
		if(ch == 10)
			line = line + 1;
	}
	fclose(fptr);
	//Sorgt dafuer das der letzte Zehner ignoriert wird
	line = line - 1;
	fileOpen("std.txt"); //Datei zweites mal oeffnen

	char array[10];
	//Erste Zeile printen:
	for(int i = 0; i < 5; i++)
	{
		array[i] = fgetc(fptr);
	}
	printf("\nStunden: %s", array);

	//Restliche Zeilen printen:
	ch = fgetc(fptr);
	int counter = 0;
	while(!feof(fptr))
	{
		ch = fgetc(fptr);
		if (ch == 10)
		{
		counter++;
			for(int x = 0; x < 5; x++)
			{
				array[x] = fgetc(fptr);
			}
			printf("\nStunden: %s", array);
		}
		//Verhindert das printen des letzten Zehners:
		if (counter == line) 
			break;
	}
	printf("\n");
	fclose(fptr);
   return(0);
}

//Funktion zum Datei oeffnen:
void fileOpen(char *f)
{
	fptr = fopen(f, "r");
	if (fptr == NULL)
	{
		printf("couldnt open\n");
		exit(0);
	}
}
Zuerst habe ich die Datei geöffnet, alle Zehner gezählt, wieder geschlossen und die Datei wieder zum printen geöffnet. Der Zehner bedeutet wahrscheinlich Zeilenumbruch, am Ende der Textdatei steht jedoch auch eine Zehn die musste ich dann von den der Variabel line abziehen um nicht Schrott auszudrucken.

Re: Datei nächste Zeile

Verfasst: Sa Aug 04, 2018 8:10 am
von rudzan
ok, ich hab das ganze nun nochmals mit fgets verbessert. Bei einer Datei wo z.B. folgendes drinsteht:

Projekt: Wohnhaus

Zeit:__Datum:___Tätigkeit:

00,25 14.11.2017 Bier holen
02,20 18.11.2017 Latten lackieren
01,50 25.11.2017 Gerüst aufstellen

Können mit unten angegebenen Code, die Stunden herausgelesen und zusammengezählen werden.

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>

int main () 
{
	FILE *pf;
	pf = fopen("tst.txt", "r");
	if (pf == NULL)
	{
		printf("Fehler beim oeffnen!!!\n");
		exit(1);
	}
	char zeile[100];
	int zeilenAnzahl = 0;
	float std, summ;
	char zahl[100];
	printf("\n");
	while(!feof(pf))
	{
		zeilenAnzahl++;
		fgets(zeile, 100, pf);
		printf("%s", zeile);
		if (zeilenAnzahl > 4 )//Ab welcher Zeile die Stunden...
		{
			for(int i = 0; i < 6; i++)//Wieviele Zeichen
			{
				if (zeile[3]==',')//Komma zu Punkt
					zeile[3] = '.';
				zahl[i] = zeile[i];
			}
			std = atof(zahl);
			summ += std;
		}
	}
	printf("Summe: %.2f\n", summ);
   return(0);
}
Durch die int Variable "zeilenAnzahl" kann ich entscheiden ab welcher Zeile die angegebenen Stunden bearbeitet werden sollten.