Datei nächste Zeile

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
rudzan
Beiträge: 3
Registriert: Mi Jul 25, 2018 3:27 pm

Datei nächste Zeile

Beitrag von rudzan » Mi Jul 25, 2018 4:14 pm

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

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Datei nächste Zeile

Beitrag von Xin » Mi Jul 25, 2018 4:55 pm

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Datei nächste Zeile

Beitrag von nufan » Mi Jul 25, 2018 5:38 pm

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.

rudzan
Beiträge: 3
Registriert: Mi Jul 25, 2018 3:27 pm

Re: Datei nächste Zeile

Beitrag von rudzan » Do Jul 26, 2018 3:55 pm

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.

rudzan
Beiträge: 3
Registriert: Mi Jul 25, 2018 3:27 pm

Re: Datei nächste Zeile

Beitrag von rudzan » Sa Aug 04, 2018 8:10 am

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.

Antworten