0 Daumen
242 Aufrufe

Frage: Programmiersprache C

Hallo,

folgendes Problem. Ich habe ein C-Programm geschrieben was mir eine bestimmte Liste nach einem Namen durchsucht. Das Ziel des C-Programmes wäre wie folgt: Ich gebe ein Wort ein z.b JOHNSON.

Dann sollte mir das Programm die Zeile printen in der der Name JOHNSON vorkommt. Allerdings sollten dann nicht alle Zeilen geprintet werden die den Namen JOHNSON haben, sondern nur die erste gefundene Zeile. Die Namen können nur eindeutig anhand der Ersten Spalte zugeordnet werden. Aktuell werden alle Zeilen geprintet.

Also bei meinem Beispiel sollte nach dem Suchstring JOHNSON die Ausgabe wie folgt sein:
11775 09/10/1987 JOHNSON WORLDWIDE ASSOCIATES INC JWAIA 17.75000 . 1.00000
11826 31/12/1925 ENDICOTT JOHNSON CORP 68.37500 . 2.00000
22111 25/09/1944 JOHNSON & JOHNSON 34.75000 . 2500.47

Ich stehe aktuell auf dem Schlauch und kann das Problem selbst nicht lösen. Hoffe ich habe mein Problem verständlich erklärt. Danke für eine Hilfestellung.

Hier ist das Beispiel auf onlinegdb: https://onlinegdb.com/v-d2hBX2f

Bitte das Beispiel selbst testen, dann versteht man meine Frage evtl. besser. Also kurz gesagt ich müsste die aktuelle Zeile (erste Spalte) mit der vorherigen Zeile vergleichen und schauen ob diese gleich sind.


Code:

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

#define BUF 255

/* Anpassen nach Bedarf... */
const char trennzeichen[] = ".;,:\"\' ";

int main()
{
FILE *f=fopen("/tmp/abc123", "w");
fputs("11775 09/10/1987 JOHNSON WORLDWIDE ASSOCIATES INC JWAIA 17.75000 . 1.00000\n11775 12/10/1987 JOHNSON WORLDWIDE ASSOCIATES INC JWAIA 17.00000 . 1.00000\n11775 13/10/1987 JOHNSON WORLDWIDE ASSOCIATES INC JWAIA 18.00000 . 1.00000\n11775 14/10/1987 JOHNSON WORLDWIDE ASSOCIATES INC JWAIA 17.50000 . 1.00000\n11775 15/10/1987 JOHNSON WORLDWIDE ASSOCIATES INC JWAIA 17.25000 . 1.00000\n11775 16/10/1987 JOHNSON WORLDWIDE ASSOCIATES INC JWAIA 16.12500 . 1.00000\n11775 19/10/1987 JOHNSON WORLDWIDE ASSOCIATES INC JWAIA 14.25000 . 1.00000\n11775 20/10/1987 JOHNSON WORLDWIDE ASSOCIATES INC JWAIA 12.25000 . 1.00000\n11775 21/10/1987 JOHNSON WORLDWIDE ASSOCIATES INC JWAIA 14.25000 . 1.00000\n11775 22/07/2003 JOHNSON OUTDOORS INC JOUT 14.16900 . 1.00000\n11775 23/07/2003 JOHNSON OUTDOORS INC JOUT 14.06000 . 1.00000\n11775 24/07/2003 JOHNSON OUTDOORS INC JOUT 14.19000 . 1.00000\n11775 25/07/2003 JOHNSON OUTDOORS INC JOUT 15.52000 . 1.00000\n11775 28/07/2003 JOHNSON OUTDOORS INC JOUT 14.74900 . 1.00000\n11775 29/07/2003 JOHNSON OUTDOORS INC JOUT 14.42900 . 1.00000\n11775 30/07/2003 JOHNSON OUTDOORS INC JOUT 14.22000 . 1.00000\n11775 31/07/2003 JOHNSON OUTDOORS INC JOUT 14.31900 . 1.00000\n11825 31/12/2021 CYBEROPTICS CORP CYBE 46.50000 . 1.00000\n11826 31/12/1925 ENDICOTT JOHNSON CORP 68.37500 . 2.00000\n11826 02/01/1926 ENDICOTT JOHNSON CORP 68.50000 . 2.00000\n22111 25/09/1944 JOHNSON & JOHNSON 34.75000 . 2500.47\n22111 26/09/1944 JOHNSON & JOHNSON 34.12500 . 2500.47\n22111 27/09/1944 JOHNSON & JOHNSON 33.75000 . 2500.47\n22111 28/09/1944 JOHNSON & JOHNSON 33.62500 . 2500.47\n22111 29/09/1944 JOHNSON & JOHNSON -33.87500 . 2500.47\n22111 30/09/1944 JOHNSON & JOHNSON -33.81250 . 2500.47\n22111 02/10/1944 JOHNSON & JOHNSON 34.00000 . 2500.47\n22111 03/10/1944 JOHNSON & JOHNSON 34.00000 . 2500.47\n22111 04/10/1944 JOHNSON & JOHNSON 33.75000 . 2500.47\n",f);
fclose(f);

f=fopen("/tmp/abc123","r");

char searchstring[BUF];
char puffer[BUF], puffer_bak[BUF];
int counter=1;
char *word;

if(f == NULL)
{
printf("Fehler bei fopen()...");
return EXIT_FAILURE;
}
printf("Wonach suchen Sie in : ");
scanf("%s", searchstring);
printf("\n");
char *sp;

while(fgets(puffer, BUF, f) != NULL)
{
strcpy(puffer_bak, puffer);
word = strtok(puffer, trennzeichen);
while(word != NULL)
{
if(strcmp(word,searchstring) == 0)
{
printf("%s",puffer_bak);
}

word = strtok(NULL,trennzeichen);
}
}

return 0;
}
Avatar von

Verwende die Funktion FILE* tmpfile() aus stdio.h um temporäre Dateien zu erzeugen:

#include <stdio.h>

int main(int argc, char* argv[]) {
FILE* f = tmpfile();

fputs("Hello World!", f);
fflush(f);
rewind(f);

char s[256];
fgets(s, 256, f);
printf("%s\n",s);
}

Die temporäre Datei wird automatisch gelöscht, wenn sie geschlossen wird. Das passiert spätestens wenn das Programm beendet wird.

Außerdem ist garantiert, dass tatsächlich eine neue Datei erzeugt wird anstatt eine möglicherweise schon vorhandene zu überschreiben.

1 Antwort

0 Daumen

Vor der while-Schleife eine Variable anlegen in der gespeichert wird ob etwas ausgegeben wurde.

In der Bedingung der while-Schleife prüfen ob etwas ausgegeben wurde.

Unmittelbar nach der Ausgabe obige Variable so belegen, dass in der Bedingung erkannt wird, dass etwas ausgegeben wurde.

Avatar von 5,6 k

Ein anderes Problem?

Stell deine Frage

Ähnliche Fragen

Willkommen bei der Stacklounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community