C Text einlesen aus einer Datei und in ein Char Array speichern

N

Neulin91

Gast
Danke schon mal für eure Hilfe.
Grüße der Neulin
 
Zuletzt bearbeitet: (ERLEDIGT)
Neulin91 schrieb:
Also vielleicht könnt ihr mir helfen das er die Zeilen einzeln in Abspeichert.

Du hast es doch schon fast geschafft. Nur eine kleine Modifikation war nötig:
Code:
#include <stdio.h>  //standard input output
#include <stdlib.h> //standard bibliothek

const char FILEIN[] = "input.txt";
#define BUFLEN 4096

 int main() 
{
 FILE *fh;
 char *fn = FILEIN;
 int   nCon = 0;
 
 char *zeile = malloc(BUFLEN * sizeof(char));
 char **Con  = malloc(2 * sizeof(char*));
 
 if ((fh = fopen(fn, "r")) == NULL) {
    perror(fn);
    return EXIT_FAILURE;
 }
 
 while (fgets(zeile, BUFLEN, fh) != NULL) {
    int len   = strlen(zeile) + 1;
    Con[nCon] = malloc(len * sizeof(char));
    strcpy(Con[nCon], zeile);
    nCon++;
 }
 
 for (int i = 0; i < nCon; i++) {
    printf("Con[%d]:\t%s", i, Con[i]);
 }
 
 return 0;
}

Erklär mal bitte ganz genau, was ich geändert habe - und warum.
 
Danke schon mal für eure Hilfe.
Grüße der Neulin
 
Zuletzt bearbeitet: (ERLEDIGT)
Neulin91 schrieb:
Hatte auch versucht ihn zu kompilieren um es besser zu verstehen und mir die ausgabe anzusehen, aber da folgen Fehlermeldungen.

Welche Fehlermeldungen kommen? Welcher Compiler ist das?
 
Danke schon mal für eure Hilfe.
Grüße der Neulin
 
Zuletzt bearbeitet: (ERLEDIGT)
Neulin91 schrieb:
einlesen2.c: In function ‘main’:
einlesen2.c:10:17: warning: initialization discards ‘const’ qualifier from pointer target type [enabled by default]
char *fn = FILEIN;

const char *fn = FILEIN;

einlesen2.c:23:21: warning: incompatible implicit declaration of built-in function ‘strlen’ [enabled by default]
int len = strlen(zeile) + 1; // strlen liest einen String bis /0 bzw. zum Nullbyte
einlesen2.c:25:9: warning: incompatible implicit declaration of built-in function ‘strcpy’ [enabled by default]
strcpy(Con[nCon], zeile); // Kopieren von String

schreib mal bitte oben drüber (zu den anderen includes):

#include <string.h>



Probier mal ;)
 
Danke schon mal für eure Hilfe.
Grüße der Neulin
 
Zuletzt bearbeitet: (ERLEDIGT)
Neulin91 schrieb:
Fehlermeldung:
einlesen2.c: In function ‘main’:
einlesen2.c:11:17: warning: initialization discards ‘const’ qualifier from pointer target type [enabled by default]
char *fn = FILEIN; ^

Dafür (Zeile 11):

const char *fn = FILEIN;


hinschreiben, oder:

char FILEIN[] = "input.txt";

in Zeile 5 das const wegnehmen. Entweder beide "const" oder keiner.
 
Danke schon mal für eure Hilfe.
Grüße der Neulin
 
Zuletzt bearbeitet: (ERLEDIGT)
Neulin91 schrieb:
Durch die for-Schleife machst du nur das der die Con[_] hochzählt. Aber meine Frage ist jetzt, wird jede Zeile in einem eigenen Char Array gespeichert?

Also Zeile 1 in Char *Zeile
und Zeile 2 in Char **Con ?

Weil ich brauch theoretisch Zeile 1 in einem Char Array und Zeile 2 in einem eigenen Char Array.
Die Text Datei hat immer nur Zwei Zeilen, wenn sie mehr hat soll eine Fehlermeldung ausgegeben werden.

Ja, jede Zeile ist in einem eigenen Char-Array, welches vorher entsprechend der Länge des eingelesenen Strings (Zeile) angelegt wird (Zeile 25). Das erste char-Array (erste Zeile Input) ist in Con[0] und das zweite (zweite Zeile Input) in Con[1]. Diese Arrays sind voneinander unabhängig. Diese beiden "Halter" für die Arrays (Con[0] und Con[1]) werden am Anfang des Programms angelegt (siehst Du wo?).

Wenn das Programm meckern soll falls mehr als zwei Zeilen kommen, kannst Du es so modifizieren:
Code:
#include <stdio.h>  // standard input output
#include <stdlib.h> // standard bibliothek
#include <string.h> // zeichenketten

const char FILEIN[] = "input.txt";

 int main() 
{
 FILE *fh;
 const char *fn = FILEIN;
 int   nCon = 0;
 
 #define BUFLEN 4096
 char *zeile = malloc(BUFLEN * sizeof(char));
 char **Con  = malloc(2 * sizeof(char*));
 
 if ((fh = fopen(fn, "r")) == NULL) {
    perror(fn);
    return EXIT_FAILURE;
 }
 
 while (fgets(zeile, BUFLEN, fh) != NULL) {
    if (nCon < 2) {
       int len = strlen(zeile) + 1;
       Con[nCon] = malloc(len * sizeof(char));
       strcpy(Con[nCon], zeile);
       nCon++;
    }
    else {
       printf("Achtung: mehr als zwei Zeilen. Nicht gut!\n");
    }
 }
 
 for (int i = 0; i < nCon; i++) {
    printf("Con[%d]:\t%s", i, Con[i]);
 }
 
 return 0;
}
 
Danke schon mal für eure Hilfe.
Grüße der Neulin
 
Zuletzt bearbeitet: (CLOSE)
Und das ist der Grund, warum man jemandem, der etwas lernen will, nicht einfach die Lösung hinwirft.
 
Neulin91 schrieb:
Meinst du damit die Zeile 11 int nCon = 0;

Nein, ich meine die Zeile 15: "char **Con = malloc(2 * sizeof(char*));".

Noch zwei Fragen, wofür ist eigentlich das #define BUFLEN 4096?

Da Du Deine eingelesenen Textzeilen unbedingt in ein "dynamisches" Char-Array kopieren mußt, ist es praktisch, vorher zu prüfen wie lang der Text in jeder Zeile ist (Zeile 24: "int len = strlen(zeile) + 1;"). Für diese "Messung" mußt Du den Text aber erstmal haben, daher liest Du in zunächst in einen "Puffer" ein, der mit Sicherheit genug Platz (4096 Zeichen) für jede denkbare Zeichenkette hat. Dieser Puffer ("char *zeile = malloc(BUFLEN * sizeof(char));") dient nur zum Auslesen, aber nicht zum Aufbewahren.

Die zweite Frage wäre, kann ich jetzt am Ende des Programms die einzelnen Char Arrays also Con[0] und Con[1], einzeln Aufrufen und weiter bearbeiten?

Con[0] und Con[1] sind jeweils die beiden gewünschten Char-Arrays, Con selbst ist ein Array von zwei Char-Arrays. Con[0] (oder Con[1]) kannst Du ganz genau so benutzen, wie Du einen normalen String in C benutzen würdest. Z. B. würde man so: "strcpy(Con[0], "Hallo Neulin91"); " den Text "Hallo Neulin91" in das Char-Array Con[0] hinein kopieren. Siehe auch Zeile 26.

Sorry, komm mir gerade total doof vor, aber bin in C total neu :confused_alt:

Der eingangs gepostete Quelltext stammt nicht von Dir?
Ergänzung ()

asdfman schrieb:
Und das ist der Grund, warum man jemandem, der etwas lernen will, nicht einfach die Lösung hinwirft

Ganz so ist es ja nicht, er hatte am Anfang einen "fast kompletten" Quelltext geliefert.
 
Danke schon mal für eure Hilfe.
Grüße der Neulin
 
Zuletzt bearbeitet: (CLOSE)
Gibt es irgendeinen speziellen Grund, warum du deine Beiträge alle löschst?
So kann niemand mehr die Diskussion nachvollziehen und Leuten mit einem ähnlichen Problem müssen einen neuen Thread eröffnen...
 
Zurück
Oben